Получить последнюю запись в каждую неделю в течение нескольких лет

У меня есть следующая таблица для хранения истории для сущностей:

    Date                   Id        State
    -------------------------------------
    2017-10-10              1        0
    2017-10-12              1        4
    2018-5-30               1        8
    2019-4-1                2        0
    2018-3-6                2        4
    2018-3-7                2        0

Я хочу получить последнюю запись для каждого идентификатора в течение одной недели, например

    Date                   Id        State
    -------------------------------------
    2017-10-12              1        4
    2018-5-30               1        8
    2019-4-1                2        0
    2018-3-7                2        0

Я бы попытался использовать Partition by :

select
        ID
       ,Date
        ,State
        ,DatePart(week,Date) as weekNumber
        from TableA
where   Date = (
            select max(Date) over (Partition by Id Order by DatePart(week, Date) Desc)
        )
order by ID

но это все равно дает мне больше одного результата в неделю.

Всего 1 ответ


Вы можете использовать ROW_NUMBER() :

SELECT a.*
FROM (SELECT a.*, ROW_NUMBER() OVER (PARTITION BY a.id, DATEPART(WK, a.Date) ORDER BY a.Date DESC) AS Seq
      FROM tablea a
     ) a
WHERE seq = 1
ORDER BY id, Date;