Как реализовать несколько объединений на разных полях на основе разных функций в SQL? - PullRequest
0 голосов
/ 26 июня 2019

У меня есть несколько таблиц, как показано ниже.И мне нужно извлекать записи на основе каждого максимального уровня и последнего уровня (упорядоченного по дате) для каждого столбца ID и Type.Я использую SQL Server для запуска запроса.До сих пор я пробовал следующий запрос SQL:

select f.ID,x.MAX_LEVEL,f.TYPE, f.DATE
from (
 select ID
,TYPE
, MAX(LEVEL) as MAX_LEVEL
 from TABLEA
 GROUP BY ID, TYPE
 ) as x 
  ,
 (
  select ID
,TYPE
, MAX(DATE) as MAX_DATETIME
 from TABLEA
 GROUP BY ID, TYPE
 ) as y

 inner join TABLEA as f  
 on f.ID = x.ID and f.LEVEL = x.MAX_LEVEL

 inner join TABLEA as g 
 on f.ID = y.ID and g.DATE = y.MAX_DATETIME

 and f.DATE > DATEADD(day, -1, GETDATE())

TABLEA

ID  TYPE    LEVEL   DATE
1   ELECTRIC    2   01/06/2019
1   GAS         2   01/06/2019
2   ELECTRIC    2   01/06/2019
3   ELECTRIC    3   01/06/2019
3   ELECTRIC    3   01/06/2019
1   GAS         3   05/06/2019
1   GAS         5   13/06/2019
2   ELECTRIC    5   07/06/2019
3   GAS         5   08/06/2019
6   ELECTRIC    3   02/06/2019
2   ELECTRIC    3   04/06/2019
3   ELECTRIC    3   05/06/2019
2   GAS         10  06/06/2019
2   GAS         3   11/06/2019
3   ELECTRIC    3   11/06/2019
1   ELECTRIC    5   01/06/2019
1   GAS         3   02/06/2019
6   ELECTRIC    5   01/06/2019
1   ELECTRIC    5   10/06/2019

Ожидаемый результат:

ID  TYPE    MAX_LEVEL   LATEST_LEVEL
1   ELECTRIC    5       5
1   GAS         5       3
2   ELECTRIC    5       5
2   GAS         10      3
3   ELECTRIC    3       3
3   GAS         5       5
6   ELECTRIC    5       3

Есть мысли, как мне этого достичь?

Ответы [ 2 ]

1 голос
/ 26 июня 2019

если вы используете sqlserver, вы можете попробовать это.

SELECT ID, TYPE, MAX(T1.[LEVEL]) AS MAX_LEVEL, X.LEVEL AS LATEST_LEVEL
FROM TABLEA T1
    OUTER APPLY (SELECT TOP 1 [LEVEL] FROM TABLEA T2 WHERE T2.ID = T1.ID AND T2.TYPE = T1.TYPE ORDER BY T2.[DATE] DESC) X
GROUP BY ID, TYPE, X.[LEVEL] 
ORDER BY ID, TYPE
0 голосов
/ 26 июня 2019

К сожалению, SQL Server не имеет «первой» или «последней» функции агрегирования.Но у него есть first_value() и last_value() в качестве оконных функций.Итак, один метод:

select distinct t.id, t.type
       max(t.level) over (partition by id, type) as max_level,
       first_value(t.level) over (partition by id, type order by date desc) as latest_level
from t;

Другой альтернативой является использование оконных функций в подзапросе:

select id, type, max(level) as max_level,
       max(case when seqnum = 1 then level end) as latest_level
from (select t.*,
             row_number() over (partition by id, type order by date desc) as seqnum
      from t
     ) t
group by id, type;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...