Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 server SQL-基于操作的最新日期_Sql Server - Fatal编程技术网

Sql server SQL-基于操作的最新日期

Sql server SQL-基于操作的最新日期,sql-server,Sql Server,我在一个表中有几行,如下所示: [id]、[date1]、[action1]、[date2]、[action2]、[date3]、[action3]、[date4]、[action4] 对于每一行,您希望返回操作(由单个字母定义)与所需代码匹配的最新日期 我想我需要在某个地方使用MAX()函数,但不确定如何启动?试试这个 (您可以放置日期列,而不是我的变量。) 您可以将UNPIVOT与常用表表达式结合使用。假设您的桌子是这样的: CREATE TABLE MyTable ( ID int

我在一个表中有几行,如下所示:

[id]、[date1]、[action1]、[date2]、[action2]、[date3]、[action3]、[date4]、[action4]

对于每一行,您希望返回操作(由单个字母定义)与所需代码匹配的最新日期

我想我需要在某个地方使用MAX()函数,但不确定如何启动?

试试这个

(您可以放置日期列,而不是我的变量。)


您可以将
UNPIVOT
与常用表表达式结合使用。假设您的桌子是这样的:

CREATE TABLE MyTable
(
   ID int NOT NULL IDENTITY PRIMARY KEY,
   Date1 date NOT NULL,
   Action1 char(1) NOT NULL,
   Date2 date NOT NULL,
   Action2 char(1) NOT NULL,
   Date3 date NOT NULL,
   Action3 char(1) NOT NULL,
   Date4 date NOT NULL,
   Action4 char(1) NOT NULL
);
以及一些样本数据:

INSERT INTO MyTable(Date1, Action1, Date2, Action2, Date3, Action3, Date4, Action4)
   VALUES
      ('20170101', 'A', '20170201', 'A', '20170201', 'B', '20170101', 'C'),
      ('20170103', 'A', '20170203', 'B', '20170205', 'A', '20170101', 'C');
然后,您可以
UNPIVOT
获取操作,然后获取日期,然后像这样加入这些UNPIVOT结果:

WITH Actions AS
   (
      SELECT ID, [Action]
         FROM
            (
               SELECT ID, Action1, Action2, Action3, Action4
                  FROM MyTable
            ) P
         UNPIVOT
            (
               [Action] FOR Col IN([Action1], [Action2], [Action3], [Action4])
            ) U
   ),
Dates AS   
   (
      SELECT ID, [Date]
         FROM
            (
               SELECT ID, Date1, Date2, Date3, Date4
                  FROM MyTable
            ) P
         UNPIVOT
            (
               [Date] FOR Col IN([Date1], [Date2], [Date3], [Date4])
            ) U
   )
SELECT
      A.ID, MAX(D.[Date]) AS MaxDate
   FROM
      Actions A
      INNER JOIN Dates D ON D.ID = A.ID
   WHERE
      A.Action = 'A'
   GROUP BY
      A.ID;
结果是

ID          MaxDate
----------- ----------
1           2017-02-01
2           2017-02-05

你的桌子设计不好。你能改变它吗?不幸的是不能。每个操作都引用一个唯一的行,可能发生在不同的日期。我想隔离特定的行动,并完成它发生的最新日期
ID          MaxDate
----------- ----------
1           2017-02-01
2           2017-02-05