如何在SQL查询中将另一列的最大日期转换为新列?
我有一个带有order id和date列的表,我需要将max of enddate列放入一个新列中。下面的示例如何在SQL查询中将另一列的最大日期转换为新列?,sql,sql-server,ssis,max,temp-tables,Sql,Sql Server,Ssis,Max,Temp Tables,我有一个带有order id和date列的表,我需要将max of enddate列放入一个新列中。下面的示例 ID OrderId StartDate begindate enddate 1 2345 06/07/2011 20/08/2011 12/07/2012 2 2345 05/07/2012 11/07/2012 13/01/2014 3 2345 21/05/2014 28/10/2013 27/05/2015 4 2345
ID OrderId StartDate begindate enddate
1 2345 06/07/2011 20/08/2011 12/07/2012
2 2345 05/07/2012 11/07/2012 13/01/2014
3 2345 21/05/2014 28/10/2013 27/05/2015
4 2345 23/05/2015 03/06/2015 02/06/2017
5 2345 27/03/2017 20/06/2017 NULL
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
因此,我试图获得的输出是:
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
所需输出
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
MaxEndDate
应位于Lastenddate
列中,其中EndDate
为空
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
我已经尝试过创建临时表和应用稠密排名,但我仍然缺少一些东西,你能帮我吗
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
我正在从attreable
作为
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
SELECT id, orderid
, CASE WHEN MAX(CASE WHEN Lasttenddate IS NULL THEN 1 ELSE 0 END) = 0 THEN MAX(enddate) END
FROM #Test
WHERE
orderid = 2345
GROUP BY id, orderid
提前感谢。您可以使用
交叉应用
获取最大(结束日期)
,并将其与您的查询相结合,如下所示。如果需要,还可以根据数据量将案例
与行数
一起使用<当每个分区有许多行时,代码>交叉应用更好
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
SELECT id,
orderid,
startdate,
begindate,
enddate,
( CASE
WHEN T.enddate IS NULL THEN TM.md
ELSE NULL
END ) AS LastEnddate
FROM @MyTable T
CROSS apply (SELECT Max(enddate) MD
FROM @MyTable WHERE OrderId= T.OrderId) TM
WHERE T.orderid=2345
完整示例
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
DECLARE @MyTable TABLE
(
id INT,
orderid INT,
startdate DATE,
begindate DATE,
enddate DATE
)
INSERT INTO @MyTable
SELECT *
FROM (VALUES (1,
2345,
CONVERT(DATETIME, '06/07/2011', 103),
CONVERT(DATETIME, '20/08/2011', 103),
CONVERT(DATETIME, '12/07/2012', 103)),
(2,
2345,
CONVERT(DATETIME, '05/07/2012', 103),
CONVERT(DATETIME, '11/07/2012', 103),
CONVERT(DATETIME, '13/01/2014', 103)),
(3,
2345,
CONVERT(DATETIME, '21/05/2014', 103),
CONVERT(DATETIME, '28/10/2013', 103),
CONVERT(DATETIME, '27/05/2015', 103)),
(4,
2345,
CONVERT(DATETIME, '23/05/2015', 103),
CONVERT(DATETIME, '03/06/2015', 103),
CONVERT(DATETIME, '02/06/2017', 103)),
(5,
2345,
CONVERT(DATETIME, '27/03/2017', 103),
CONVERT(DATETIME, '20/06/2017', 103),
NULL) ) t (id, orderid, startdate, begindate, enddate)
SELECT id,
orderid,
startdate,
begindate,
enddate,
( CASE
WHEN T.enddate IS NULL THEN TM.md
ELSE NULL
END ) AS LastEnddate
FROM @MyTable T
CROSS apply (SELECT Max(enddate) MD
FROM @MyTable WHERE OrderId= T.OrderId) TM
WHERE T.orderid=2345
输出
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
id orderid startdate begindate enddate LastEnddate
1 2345 2011-07-06 2011-08-20 2012-07-12 NULL
2 2345 2012-07-05 2012-07-11 2014-01-13 NULL
3 2345 2014-05-21 2013-10-28 2015-05-27 NULL
4 2345 2015-05-23 2015-06-03 2017-06-02 NULL
5 2345 2017-03-27 2017-06-20 NULL 2017-06-02
试试这个:
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
SELECT id, orderid,enddate, CASE WHEN enddate is null
THEN MAX(enddate) over (partition by orderid) else null END as LastEnddate
FROM #Test
WHERE orderid = 2345
输出:
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
id orderid enddate LastEnddate
1 2345 2012-07-12 NULL
2 2345 2014-01-13 NULL
3 2345 2015-05-27 NULL
4 2345 2017-06-02 NULL
5 2345 NULL 2017-06-02
使用Cte,使用
行号
<代码>最大日期使用最大行数
计算。
日期输出为所需的字符串格式
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
DECLARE @table TABLE (id INT, orderid INT, startdate VARCHAR(100), begindate VARCHAR(100), enddate VARCHAR(100))
INSERT INTO @table (ID, OrderId, StartDate, begindate, enddate)
SELECT 1, 2345, '06/07/2011', '20/08/2011', '12/07/2012'
UNION ALL
SELECT 2, 2345, '05/07/2012', '11/07/2012', '13/01/2014'
UNION ALL
SELECT 3, 2345, '21/05/2014', '28/10/2013', '27/05/2015'
UNION ALL
SELECT 4, 2345, '23/05/2015', '03/06/2015', '02/06/2017'
UNION ALL
SELECT 5, 2345, '27/03/2017', '20/06/2017', NULL;
WITH DATE
AS (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY orderid ORDER BY enddate DESC
) rn
FROM @table
WHERE enddate IS NOT NULL
)
SELECT t.id, t.orderid, t.startdate, t.enddate, CASE WHEN t.enddate IS NOT NULL THEN NULL ELSE convert(VARCHAR(10), (
SELECT max(convert(DATETIME, enddate, 103))
FROM DATE
), 103) END DATE
FROM @table t
LEFT JOIN DATE d
ON d.id = t.id
AND t.orderid = d.orderid
除了你的回答之外
我将使用以下查询(从性能角度)
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
在Max(enddate)解决方案中,与上一个值解决方案相比,您将获得更多的逻辑读取
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
见统计结果:
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
最大值(结束日期)->
表“工作台”。扫描计数3,逻辑读取15,物理读取0,预读0,lob逻辑读取0,lob物理读取0,lob预读0。
表“#B131B1E5”。扫描计数1,逻辑读取1,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
最后一个值->
表“工作台”。扫描计数0,逻辑读取0,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。
表“#B131B1E5”。扫描计数1,逻辑读取1,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**
*注意:此解决方案将在SQL Server 2012及更高版本上运行您好,感谢您的回复,当我使用上述脚本时,我在最后一个enddate列中得到Max(begindate),但我希望输出为Max(enddate)。您好,我尝试了此方法,它工作正常,但我想要的日期是Max(enddate)=2017年6月2日,但我对2019年3月31日的日期有点困惑,请您帮助检查我用样本数据更新的示例。您可能有一些您在问题中没有提到的附加条件。我已经添加了orderid条件,它现在应该可以工作了。
ID OrderId StartDate begindate enddate LastEnddate
1 2345 06/07/2011 20/08/2011 12/07/2012 NULL
2 2345 05/07/2012 11/07/2012 13/01/2014 NULL
3 2345 21/05/2014 28/10/2013 27/05/2015 NULL
4 2345 23/05/2015 03/06/2015 **02/06/2017** NULL
5 2345 27/03/2017 20/06/2017 NULL **02/06/2017**