Найти второе по величине значение с группировками - PullRequest
2 голосов
/ 28 марта 2020

На SQL сервере я пытаюсь вытащить вторую последнюю NOTE_ENTRY_DT_TIME (элементы, выделенные на скриншоте). С запросом, написанным ниже, он по-прежнему получает самую последнюю дату (я полагаю, это из-за группировки, но к группе требуется присоединиться позже) Каков наилучший метод для достижения этой цели?

SELECT 
    hop.ACCOUNT_ID,
    MAX(hop.NOTE_ENTRY_DT_TIME) AS latest_noteid
FROM
    NOTES hop
WHERE 
    hop.GEN_YN IS NULL
    AND hop.NOTE_ENTRY_DT_TIME < (SELECT MAX(hope.NOTE_ENTRY_DT_TIME)
                                  FROM NOTES hope
                                  WHERE hop.GEN_YN IS NULL)
GROUP BY
    hop.ACCOUNT_ID  

Образец данных в таблице:

I would need the items highlighted

Ответы [ 2 ]

3 голосов
/ 28 марта 2020

Один из "более простых" способов получить N-ую строку в группе - это использовать CTE и ROW_NUMBER:

WITH CTE AS(
    SELECT Account_ID,
           Note_Entry_Dt_Time,
           ROW_NUMBER() OVER (PARTITION BY AccountID ORDER BY Note_Entry_Dt_Time DESC) AS RN
    FROM dbo.YourTable)
SELECT Account_ID,
       Note_Entry_Dt_Time
FROM CTE
WHERE RN = 2;

Конечно, если ACCOUNT_ID имеет только 1 строку, тогда он не будет возвращен в наборе результатов.

Оператор OP "Строка не всегда будет 2." из комментариев вступает в противоречие с их утверждением "Я пытаюсь вытащить второй последний NOTE_ENTRY_DT_TIME " в вопросе. В лучшем случае это означает, что у ОП есть строки с одинаковой датой, которая может быть самой «последней» датой. Если это так, то просто нужно заменить ROW_NUMBER на DENSE_RANK. Однако данные их выборок не позволяют предположить, что это так.

0 голосов
/ 28 марта 2020

Вы можете использовать оконные функции:

select *
from (
    select 
        n.*, 
        row_number() over(partition by account_id order by note_entry_dt_time desc) rn
    from notes n
) t
where rn = 2
...