在一个查询中查找多个最大日期

Posted

技术标签:

【中文标题】在一个查询中查找多个最大日期【英文标题】:Find multiple max dates in one query 【发布时间】:2018-12-10 22:25:33 【问题描述】:

我有一个数据集,我试图在其中找到以下内容: 如果 statusid = 113917,那么我想找到最大日期并将其称为“startstatusdate”。如果statusid = 49938,那么我会找到最大日期并将其称为“endstatusdate”。

 declare @t table(practid int, statusid int, statusdate date)

 insert into @t values (1, 113917, '2018-03-01'),
                        (1, 113917, '2018-04-01'),
                        (1, 113917, '2018-05-01'),
                        (1, 49938, '2018-06-01'),
                        (2, 113917, '2018-03-15'),
                        (2, 113917, '2018-03-18'),
                        (2, 49938, '2018-04-22')  

我想要这样的结果:

    practid           startstatusdate     endstatusdate
      1                  2018-03-01          2018-06-01
      2                  2018-03-15          2018-04-22

我可以使用两个临时表来创建它,一个获取最大 startstatusdate,另一个获取最大 endstatusdate,然后加入这些表。但我想在一个查询中执行此操作。

我正在尝试这样的事情:

    Select practid,
           (select max(statusdate)
            from Table A
            where statusid = 113917) as startstatusdate,
           (select max(statusdate)
            from Table A
            where statusid = 49938) as endstatusdate
    from Table A
    group by practid

【问题讨论】:

你可以通过CASE statement来做到这一点 【参考方案1】:

您可以使用case 表达式仅从相关状态中获取值:

SELECT   practid,
         MAX(CASE statusid WHEN 113917 THEN statusdate END) AS startstatusdate,
         MAX(CASE statusid WHEN 49938 THEN statusdate END) AS endstatusdate
FROM     table_a
GROUP BY practid

【讨论】:

这就是我要找的。看起来很简单,我应该自己想到这一点。【参考方案2】:

@JNevill 说的对,这是一个简单的 CASE 语句。

DECLARE @T TABLE(PRACTID INT, STATUSID INT, STATUSDATE DATE)

INSERT INTO @T VALUES (1, 113917, '2018-03-01'),
                        (1, 113917, '2018-04-01'),
                        (1, 113917, '2018-05-01'),
                        (1, 49938, '2018-06-01'),
                        (2, 113917, '2018-03-15'),
                        (2, 113917, '2018-03-18'),
                        (2, 49938, '2018-04-22')  

SELECT PRACTID,
    MIN(CASE STATUSID WHEN 113917 THEN STATUSDATE END) AS STARTSTATUSDATE,
    MAX(CASE STATUSID WHEN 49938 THEN STATUSDATE END) AS ENDSTATUSDATE
FROM @T
GROUP BY PRACTID

注意:(根据您想要的结果)看起来您想将MIN 用于startstatusdate,这应该将您想要的结果应用于您声明的表@t

【讨论】:

以上是关于在一个查询中查找多个最大日期的主要内容,如果未能解决你的问题,请参考以下文章

选择查询以连续查找最大日期

在访问查询中查找两个字段的 MAX 日期

SQL查询以查找列和行中的最大值

oracle 查询每组的最大值

mysql中多个字段中的最大值

在包含多个开始和日期列表的表中查找日期,如果找到则返回默认值