предпоследняя дата для каждой записи - PullRequest
0 голосов
/ 04 июля 2018

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

Например:

id  date
1   01.01.2018
1   05.01.2018
1   06.02.2018
2   01.06.2018
2   03.06.2018
3   12.12.2017

Из этой записи мне нужно написать select, которая показывает мне следующее:

ID   max_date   penultimate
1   06.02.2018   05.01.2018
2   03.06.2018   01.06.2018
3   12.12.2017   NULL

Есть идеи, как это сделать? заранее большое спасибо

Ответы [ 4 ]

0 голосов
/ 04 июля 2018

Просто оптимизированный запрос:

;WITH cte AS
(
    SELECT id AS ID
        ,[date] AS max_date
        ,LEAD ([date], 1, 0) OVER (PARTITION BY id ORDER BY [date] DESC) AS penultimate
        ,ROW_NUMBER() OVER(PARTITION BY id ORDER BY [date] DESC) AS RN
    FROM Table3
)
SELECT ID,max_date,penultimate
FROM cte
WHERE RN=1

SQL Fiddle

0 голосов
/ 04 июля 2018

Использование условного агрегирования и функции стандарта ANSI row_number() или dense_rank():

select id,
       max(date) as max_date,
       max(case when seqnum = 2 then date end) as penultimate_date
from (select t.*,
             dense_rank() over (partition by id order by date desc) as seqnum
      from t
     ) t
where seqnum in (1, 2)
group by id;

Используйте row_number(), если даты могут быть одинаковыми в случае связей.

0 голосов
/ 04 июля 2018

Я так написал,

SELECT ID
    ,max(StartDate) MaxDate
    ,(
        SELECT StartDate
        FROM YourTable t2
        WHERE t2.id = t1.id
        ORDER BY StartDate DESC OFFSET 1 ROWS FETCH NEXT 1 ROW ONLY
        ) penultimate
FROM YourTable t1
GROUP BY id
0 голосов
/ 04 июля 2018

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

SELECT
    T.id,
    MAX(T.date) max_date,
    (
        SELECT
            MAX(N.date)
        FROM
            YourTable N
        WHERE
            N.id = T.id AND
            N.date < MAX(T.date)
    ) penultimate
FROM
    YourTable T
GROUP BY
    T.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...