Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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_Greatest N Per Group - Fatal编程技术网

从一行中的多个日期中选择最早日期的SQL

从一行中的多个日期中选择最早日期的SQL,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,我在MS SQL Server管理工作室工作。我在patientId上创建了一个视图,每个患者/行有12个相关日期。SQL中是否有一种方法可以找到每行的最小和最大日期? 任何帮助都将不胜感激。您可以使用“unpivot”。检查以下示例: CREATE TABLE dates ( number INT PRIMARY KEY , date1 DATETIME , date2 DATETIME , date3 DATETIME ) I

我在MS SQL Server管理工作室工作。我在patientId上创建了一个视图,每个患者/行有12个相关日期。SQL中是否有一种方法可以找到每行的最小和最大日期? 任何帮助都将不胜感激。

您可以使用“unpivot”。检查以下示例:

CREATE TABLE dates
    (
      number INT PRIMARY KEY ,
      date1 DATETIME ,
      date2 DATETIME ,
      date3 DATETIME
    )

INSERT  INTO dates
VALUES  ( 1, '1/1/2018', '2/4/2018', '3/1/2018')
INSERT  INTO dates
VALUES  ( 2, '1/2/2018', '2/3/2018', '3/3/2018')
INSERT  INTO dates
VALUES  ( 3, '1/3/2018', '2/2/2018', '3/2/2018')
INSERT  INTO dates
VALUES  ( 4, '1/4/2018', '2/1/2018', '3/4/2018')
GO

SELECT  number ,
        MIN(dDate) mindate,
        MAX(dDate) maxDate 
FROM    dates UNPIVOT ( dDate FOR nDate IN ( Date1, Date2,Date3 ) ) as u
GROUP BY number 
GO
另一种方式:

create table MyDates
(
    ID int,
    D1 datetime,
    D2 datetime,
    D3 datetime
)

insert  MyDates(ID, D1, D2, D3)
values  (1, '19000101', '19720506', '20060204'),
        (2, '20170624', '20180821', '20180901'),
        (3, '19820202', '19840721', '19851231')

select  *,
        (select min(v) from (values(D1), (D2), (D3)) t(v)) [Min],
        (select max(v) from (values(D1), (D2), (D3)) t(v)) [Max]
from MyDates

我会使用
交叉应用

select t.*, v.mind, v.maxd
from t cross apply
     (select min(v.d) as mind, max(v.d) as maxd
      from (values (d1), (d2), (d3), (d4), (d5), (d6), (d7), (d8), (d9), (d10), (d11), (d12)
           ) v(d)
     ) v;

请注意,
min()
max()
忽略
NULL
值。

添加示例数据和预期输出请尝试阅读分组依据、最小值、最大值和联接。您是否询问如何计算单行中多个字段的最小值/最大值?不错的替代方法,我喜欢。感谢您的分享。请注意,使用
apply
和子查询的版本应该具有更好的性能。