Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL查询中将另一列的最大日期转换为新列?_Sql_Sql Server_Ssis_Max_Temp Tables - Fatal编程技术网

如何在SQL查询中将另一列的最大日期转换为新列?

如何在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

我有一个带有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    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**
Max
EndDate
应位于
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**