Загадка SQL, как выбрать последнюю дату для части, но только 1 строку для части (уникальную)

Я пытаюсь обдумать это сегодня утром.

Я пытаюсь показать статус inventory для деталей (для наших продуктов), и этот запрос становится сложным только в том случае, если я пытаюсь вернуть все детали.

Позвольте мне выложить это:

  • один стол inventoryReport
  • У меня есть отдельный список X деталей, которые я хочу отобразить, результатом которого должно быть X # строк (1 строка на деталь, показывающая последнюю инвентарную запись).
  • таблица состоит из датированных записей об изменениях запасов (поэтому мне нужна только запись даты LATEST для каждой детали).
  • все данные, содержащиеся в этой единственной таблице, поэтому соединения не требуются.

В настоящее время для одной отдельной части это довольно просто, и я могу выполнить это, выполнив следующий sql (чтобы дать вам некоторое представление):

SELECT     TOP (1) ldDate, ptProdLine, inPart, inSite, inAbc, ptUm, inQtyOh + inQtyNonet AS in_qty_oh, inQtyAvail, inQtyNonet, ldCustConsignQty, inSuppConsignQty
FROM         inventoryReport
WHERE     (ldPart = 'ABC123')
ORDER BY ldDate DESC

это дает мне мою строку TOP 1, настолько простую для каждой части, однако мне нужно показать все X (скажем, 30 частей). Итак, мне нужно 30 строк с таким результатом. Конечно, простым решением было бы зациклить X # вызовов sql в моем коде (но это было бы дорого), и этого было бы достаточно, но для этой цели я хотел бы еще немного поработать с этим SQL, чтобы уменьшить количество вызовов x # обратно в БД (если не требуется) до 1 запроса.

Из того, что я вижу здесь, мне нужно каким-то образом отслеживать последнюю дату для каждого элемента при поиске моего набора результатов.

Я бы в конечном итоге сделал

WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc)

чтобы ограничить части, которые мне нужны. Надеюсь, я достаточно ясно изложил свой вопрос. Дайте мне знать, если у вас есть идея. Я не могу сделать DISTINCT, так как строки не совпадают, дата должна быть самой последней, и мне нужно максимум X строк.

Мысли? Я застрял...


person Jakub    schedule 09.09.2010    source источник


Ответы (2)


EDIT: обязательно проверьте производительность каждого решения. Как указано в этом вопросе, метод CTE может превзойти ROW_NUMBER.

;with cteMaxDate as (
    select ldPart, max(ldDate) as MaxDate
        from inventoryReport
        group by ldPart
)
SELECT md.MaxDate, ir.ptProdLine, ir.inPart, ir.inSite, ir.inAbc, ir.ptUm, ir.inQtyOh + ir.inQtyNonet AS in_qty_oh, ir.inQtyAvail, ir.inQtyNonet, ir.ldCustConsignQty, ir.inSuppConsignQty
    FROM cteMaxDate md
        INNER JOIN inventoryReport ir
            on md.ldPart = ir.ldPart
                and md.MaxDate = ir.ldDate
person Joe Stefanelli    schedule 09.09.2010

Вам нужно присоединиться к подзапросу:

SELECT i.ldPart, x.LastDate, i.inAbc
FROM inventoryReport i
INNER JOIN (Select ldPart, Max(ldDate) As LastDate FROM inventoryReport GROUP BY ldPart) x
on i.ldPart = x.ldPart and i.ldDate = x.LastDate
person Leslie    schedule 09.09.2010