Получить запись Max () из таблицы по группе - PullRequest
2 голосов
/ 04 апреля 2010

У меня есть такая таблица:

Article Number  Last Voucher Number Last Voucher Date
0557934         519048                  04/02/2005
0557934         519067                  04/02/2005
0557934         528630                  09/29/2005
0557934         528631                  09/29/2005
0557934         529374                  10/13/2005
0557934         529375                  10/13/2005
0557934         529471                  10/16/2005
0557934         529472                  10/16/2005
0557934         535306                  01/08/2006
0557934         535307                  01/08/2006
0557934         1106009                 08/10/2006
0557934         1106010                 08/10/2006
0022738         22554                   02/20/1995
0022738         22595                   03/12/1995
0022738         22597                   03/15/1995
0022738         22605                   03/19/1995
0022738         22616                   03/25/1995
0022738         22621                   03/28/1995
0022738         22630                   04/05/1995

Хотелось бы иметь только запись с последней датой:

Article Number  Last Voucher Number Last Voucher Date
0557934         1106010                 08/10/2006
0022738         22630                   04/05/1995

Я могу сделать напрямую на SQL или на Linq.

Есть идеи?

Ju

Ответы [ 3 ]

4 голосов
/ 04 апреля 2010

Самый простой способ, вероятно, использует row_number. Это также разрывает связи на ту же дату ваучера:

select *
from (
    select 
        *
    ,   row_number() over (partition by [Article Number] 
          order by [Last Voucher Date] desc, [Last Voucher Number] desc) as RowNr
    from YourTable
) as SubQueryAlias
where RowNr = 1

Другим вариантом является предложение where not exists:

select *
from YourTable yt
where not exists (
    select *
    from YourTable yt2
    where yt.[Article Number] = yt2.[Article Number]
    and yt.[Last Voucher Date] < yt2.[Last Voucher Date]
)

В случае связей для самой последней даты ваучера это вернет обе строки.

2 голосов
/ 04 апреля 2010

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

Конечно, это возвращает 2 строки для статьи 0557934, но каковы критерии разрыва связи для той же даты? Это работает лучше чаще, чем с использованием ROW_NUMBER, который я нашел, но YMMV. И ROW_NUMBER - это то, как вы можете справиться с ситуацией разрыва связей

SELECT
    M.*
FROM
    (
    SELECT
        MAX([Last Voucher Date]) AS LastDate,
        [Article Number]
    FROM
        Mytable
    GROUP BY
        [Article Number]
    ) MMax
    JOIN MyTable M ON MMax.[Article Number] = M.[Article Number] AND MMax.LastDate = M.[Last Voucher Date]
0 голосов
/ 04 апреля 2010

Если вы используете Oracle, вы бы сделали что-то вроде этого:

select *
from 
  (select *
  from Table
  order by voucher_date)
where rownum = 1
...