SQL получение 2 верхних строк по дате в соответствии с PolicyId, но с разными датами - PullRequest
0 голосов
/ 13 июля 2020
ValId | PolicyId | Date       | Value 
------+----------+------------+-------
    1 |   11     | 2020-06-01 | 2000
    2 |   11     | 2020-06-03 | 3000
    3 |   11     | 2020-06-03 | 4000
    4 |   12     | 2020-06-02 | 8000 
    5 |   12     | 2020-06-03 | 8500

Я хотел получить две последние Val строки для каждой PolicyId, но они не могут быть с той же даты.

Строки для PolicyId = 12 возвращаются правильно - ValId 4 и 5 .

Для PolicyId = 11 возвращаются строки с ValId 2 и 3, но поскольку они находятся в тот же день, я хотел, чтобы строка ValId 1 возвращалась вместо ValId 2.

SELECT 
    V.ValId, V.PolicyId, V.Value, V.Date
FROM
    (SELECT 
         ValId, PolicyId, Value, Date,
         ROW_NUMBER() OVER (PARTITION BY PolicyId ORDER BY Date Desc, ValId DESC) AS RowNum
     FROM 
         TVal) V 
WHERE  
    RowNum <= 2

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Вы можете пронумеровать строки по датам и в пределах дат:

select t.*
from (select t.*,
             dense_rank() over (partition by policyid order by date desc valId desc) as seqnum,
             rank() over (partition by policyid, date order by valId desc) as seqnum_within_date
      from tval
     ) t
where seqnum <= 2 and seqnum_within_date = 1;
1 голос
/ 13 июля 2020

Используя предложение Gordon Linoff , я смог заполнить sql, как показано ниже

Select v.* from 
(
    select t.*, 
    row_number() over (partition by policyid order by date desc valId desc) as seqnum,
    from (select t.*             
          dense_rank() over (partition by policyid, date order by valId desc) as seqnum_within_date
          from tval
         ) t where seqnum_within_date = 1
)v where seqnum <= 2 
...