SQL根据类别从表中选择最新日期

时间:2018-11-27 11:11:39

标签: sql max

我有一个这样的表要求

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 :(得分:0)

我认为您可以只使用条件聚合:

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;

答案 1 :(得分:0)

将条件聚合用作:

 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

P.S。对于 Oracle 数据库,在from dual关键字之前添加union all。将substring替换为substr

对于 MySQL ,删除部分with tab() as ( .... )

答案 2 :(得分:-1)

您可以使用Common Table ExpressionCASEMAX()

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

或者只是CASEMAX()

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