Получить одну запись за период с условием - PullRequest
1 голос
/ 21 января 2020

У меня большой запрос, создающий историю изменений объекта. Короче говоря, результат выглядит так:

id     changedOn      recordtype
1      2019-12-5      history
1      2020-01-1      history
1      2020-01-7      actual
2      2018-10-9      history

Результат, который я хочу:

id     changedOn      recordtype
1      2019-12-5      history
1      2020-01-7      actual
2      2018-10-9      history

Если в каждом месяце есть 2 записи в каждом идентификаторе, для которого я хочу пропустить записи истории в этом месяце.

Я бы хотел избежать cursor, если это возможно. Но я застрял.

Ответы [ 2 ]

1 голос
/ 21 января 2020

Если вы хотите одну запись в месяц с предпочтением «фактическая», тогда используйте row_number():

select t.*
from (select t.*,
             row_number() over (partition by id, year(changedOn), month(changedOn) order by recordtype) as seqnum
      from t
     ) t
where seqnum = 1;

Если вы хотите, чтобы все «фактические» записи за месяц - и затем, если есть нет - все записи истории, я бы порекомендовал logi c вот так:

select t.*
from t
where t.recordtype = 'actual' or
      (t.recordtype = 'history' and
       not exists (select 1
                   from t t2
                   where t2.id = t.id and
                         t2.recordtype = 'actual' and
                         year(t2.changedon) = year(t.changedon) and
                         month(t2.changedon) = month(t.changedon) 
                   );

Эти два подхода слегка различаются. Но вы заметите различия только в том случае, если у вас есть несколько «фактических» или «исторических» за один месяц для одного идентификатора.

0 голосов
/ 21 января 2020

Просто удалите записи с selectedOn, которые не самые последние

        select * from tbl a 
    where not exists
(select 1 from tbl b where a.id = b.id and a.recordtype = b.recordtype and a.changedOn < b.changedOn )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...