SQL выбирает последние даты из таблицы на основе категории - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть требование, где таблица похожа на это

Id   code        TDate          Amount
--------------------------------------------
1    A01        11/23/2018       100.20
2    A02        10/25/2018        20.20
3    B01        11/24/2018        10.10
4    C01        11/25/2018        22.12  
4    D01        11/21/2018        22.12 

Я хочу получить самую последнюю дату из группы (A01, A02) как LATEST_DT_A и (B01, C01, D01) как LATEST_DT_X. Коды здесь хорошоопределены и исправлены.Я хочу выбрать самую последнюю дату из каждой группы.

В этой таблице содержится большой объем данных, и с помощью оператора case истекает время ожидания.

Выходное значение будет

Id   LATEST_DT_A    LATEST_DT_X
------------------   ---------
1    11/23/2018      11/25/2018

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Я думаю, вы можете просто использовать условную агрегацию:

select max(case when code like 'A%' then tdate end) as latest_dt_a,
       max(case when code not like 'A%' then tdate end) as latest_dt_x
from t;
0 голосов
/ 27 ноября 2018

Используйте условное агрегирование как:

 with tab(Id,code, TDate) as
          (
           select 1,'A01','2018-11-23' union all
           select 2,'A02','2018-10-25' union all              
           select 3,'B01','2018-11-24' union all              
           select 4,'C01','2018-11-25' union all
           select 4,'D01','2018-11-21'              
          )
   select min(Id) as id,
          max( case when substring(code,1,1) ='A' then TDate end )
          as latest_dt_a,
          max( case when substring(code,1,1)!='A' then TDate end )
          as latest_dt_x
     from tab;

Rextester Demo

PS Для Oracle База данных добавить from dual перед union all ключевыми словами.Заменить substring на substr,

Для MySQL удалить деталь with tab() as ( .... )

0 голосов
/ 27 ноября 2018

Вы можете использовать Common Table Expression, CASE и MAX():

CREATE TABLE #Temp
(
    Id  INT
    ,Code   VARCHAR(10)
    ,TDate  DATE
    ,Amount NUMERIC(18,2)
);

INSERT INTO #Temp
VALUES
 (1,'A01','11/23/2018',100.20)
,(2,'A02','10/25/2018', 20.20)
,(3,'B01','11/24/2018', 10.10)
,(4,'C01','11/25/2018', 22.12) 
,(4,'D01','11/21/2018', 22.12);


WITH CTE AS
(
    SELECT  Id
            ,CASE WHEN Code IN ('A01','A02') THEN TDate ELSE NULL END LATEST_DT_A 
            ,CASE WHEN Code IN ('B01','C01','D01') THEN TDate ELSE NULL END LATEST_DT_X  
    FROM #Temp
)
SELECT  MIN(Id) Id
        ,MAX(LATEST_DT_A) LATEST_DT_A 
       ,MAX(LATEST_DT_X) LATEST_DT_X 
FROM CTE

или просто CASE и MAX()

SELECT   MIN(Id) Id
        ,MAX(CASE WHEN Code IN ('A01','A02') THEN TDate ELSE NULL END) LATEST_DT_A 
        ,MAX(CASE WHEN Code IN ('B01','C01','D01') THEN TDate ELSE NULL END) LATEST_DT_X  
FROM #Temp
...