2009-03-10 2 views
0

Я уже давно работаю с этим. поэтому решил попросить и получить некоторую помощь.Получение максимальных записей из sqlserver

У меня есть две таблицы, как например:

tblTrans: (DocNumber field is always unique) 

DocNumber  TransDate  userId 
66-FF-GHIP  03-05-08  someUser 
55-RT-JHTP  03-09-09  someOtherUser 
77-AF-KPWT  05-08-09  userId1 
09-IO-TEAG  04-08-09  thisUser 


tblTransDet: (productIdCode field + DocNumber fields are always unique) 
DocNumber  ProductIdCode  TransStatus 
66-FF-GHIP  4124    Approved 
66-FF-GHIP  2124    Pending 
66-FF-GHIP  2340    Approved 
77-AF-KPWT  4124    Approved 
55-RT-JHTP  4124    Pending 
09-IO-TEAG  2124    Pending 

Как вы можете видеть. ProductIdCode 4124 повторяется несколько раз в tblTransDet, но комбинация productIdCode и DocNumber всегда уникальна.

Как я могу получить docnumber и productID ... на основе docNumber, который имеет самый высокий transDate.

Итак, в этом примере. конечный результат будет

77-AF-KPWT 4124 
09-IO-TEAG 2124 
66-FF-GHIP 2340 

Я изменил бы tablestrcuture, если я мог :(

+0

Я не понимаю - как вы получаете ProductID 2340 для DoC# 66-FF-GHIP на основе даты? Там, похоже, нет никаких отношений ... –

+0

, потому что я получаю все productId из этой таблицы. и с 2340 года уникален ... он должен появиться. если бы было два экземпляра 2340, то тот, у которого была максимальная дата транзакции, появлялась бы – 2009-03-10 16:23:04

+0

, я тоже этого не понимаю. Возможно, вы должны показать нам несколько DDL из ваших двух таблиц. –

ответ

0

вы можете использовать подзапрос

WHERE Detail.Date = (SELECT MAX(Date) FROM TransDet) 
1

Используйте corelated подзапрос - это непроверенные:

SELECT 
    d.DocNumber, d.ProductId, t.TransDate 
FROM 
    tblTransDet d, tblTrans t 
WHERE 
    d.DocNumber = t.DocNumber 
AND 
    t.TransDate = (SELECT MAX(TransDate) FROM tblTrans 
        WHERE DocNumber = d.DocNumber) 
+0

@ Нейл, я думаю, вы должны перечитать вопрос. С данными, предоставленными ОП, это невозможно. –

+0

, это также приводит к дубликатам, а не к одной строке данных для productID и documentnumber. В этом случае это приведет к тому, что все documentnumbers, с которыми связано productID 4124. вместо того, чтобы просто привести «77-AF-KPWT 4124», поскольку этот номер документа имеет самую высокую дату – 2009-03-10 18:21:59

0
SELECT * 
FROM (
     SELECT d.DocNumber, d.ProductId, t.TransDate, 
     ROW_NUMBER() OVER (PARTITION BY d.DocNumber, d.ProductId ORDER BY TransDate DESC) AS rn 
     FROM tblTransDet d, tblTrans t 
     WHERE t.DocNumber = d.DocNumber 
     ) 
WHERE rn = 1