我有一个这样的表要求
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
答案 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;
P.S。对于 Oracle 数据库,在from dual
关键字之前添加union all
。将substring
替换为substr
,
对于 MySQL ,删除部分with tab() as ( .... )
答案 2 :(得分:-1)
您可以使用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