выбрать первый результат для каждого параметра - PullRequest
0 голосов
/ 24 октября 2019

У меня есть таблица с account_number, account_code и code_date. Я пытаюсь получить последний код для каждой учетной записи, но группа дает мне несколько наблюдений для каждой учетной записи, поэтому я даже не могу использовать первое / верхнее утверждение.

пример:

account_id  Account_Attribute_Code   current_att_date
1                579                      01.01.2005
1                254                      01.02.2006
1                366                      10.10.2018
2                748                      01.07.2008
2                766                      08.05.2009
2                205                      07.06.2014
 SELECT 
       account_id, 
       Account_Attribute_Code,
       Max(Account_Attribute_Update_Date) AS current_att_date
 FROM my_table
 GROUP BY Account_Id, 
          Account_Attribute_Code

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

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

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

select t.*
from t
where t.Account_Attribute_Update_Date = (select max(t2. Account_Attribute_Update_Date)
                                         from t t2
                                         where t2.account_id = t.account_id
                                        );

Существует несколько подходов к этой проблеме. Если индекс равен (account_id, Account_Attribute_Update_Date), то обычно он имеет наилучшую производительность.

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

0 голосов
/ 24 октября 2019

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

 SELECT 
       account_id, 
       Account_Attribute_Code,
       Account_Attribute_Update_Date,
       ROW_NUMBER() OVER (PARTITION BY account_id
                       ORDER BY Account_Attribute_Update_Date DESC) as rn
 FROM my_table where rn=1
0 голосов
/ 24 октября 2019

На SQL Server я бы использовал:

SELECT TOP 1 WITH TIES
    account_id, Account_Attribute_Code, Account_Attribute_Update_Date
FROM my_table
ORDER BY
    ROW_NUMBER() OVER (PARTITION BY account_id
                       ORDER BY Account_Attribute_Update_Date DESC);
...