【问题标题】:Select most recent inspection选择最近的检查
【发布时间】:2018-04-02 13:37:19
【问题描述】:

我有一个ROAD_INSPECTION 表:

+----+------------------------+-----------+
| ID |          DATE          | CONDITION |
+----+------------------------+-----------+
|  1 | 01/01/2009             |        20 |
|  1 | 05/01/2013             |        16 |
|  1 | 04/29/2016 10:02:52 AM |        15 |
+----+------------------------+-----------+
|  2 | 01/01/2009             |         8 |
|  2 | 06/06/2012 9:55:13 AM  |         8 |
|  2 | 04/28/2015             |        11 |
+----+------------------------+-----------+
|  3 | 06/11/2012             |        10 |
|  3 | 04/21/2015             |        19 |
+----+------------------------+-----------+

选择最近一次检查的最有效方法是什么?查询需要包含IDCONDITION 列,尽管它们不会干净地group by

+----+------------------------+-----------+
| ID |          DATE          | CONDITION |
+----+------------------------+-----------+
|  1 | 04/29/2016 10:02:52 AM |        15 |
+----+------------------------+-----------+
|  2 | 04/28/2015             |        11 |
+----+------------------------+-----------+
|  3 | 04/21/2015             |        19 |
+----+------------------------+-----------+

【问题讨论】:

    标签: sql date ms-access select greatest-n-per-group


    【解决方案1】:

    一种方法是检索派生表中的iddate 列,并将输出连接到主表以从condition 列中检索相应的数据,如下所示。

    SELECT t1.id,
           t1.date1,
           t2.CONDITION1
    FROM
      (SELECT id,
              max(date1) AS date1
       FROM table1
       GROUP BY id) t1
    JOIN table1 t2 ON t1.id = t2.id
    AND t1.date1 = t2.date1;
    

    结果:

    id  date1                  CONDITION1
    -------------------------------------
    1   29.04.2016 10:02:52    15
    2   28.04.2015 00:00:00    11
    3   21.04.2015 00:00:00    19
    

    DEMO

    或者如果您的rdbms 支持windows 功能,请在下方使用。

    SELECT id, 
           date1, 
           condition1
    FROM
      (SELECT id,
              date1,
              condition1,
              row_number() over(PARTITION BY id
                                ORDER BY date1 DESC) AS rn
       FROM table1 ) t1
    WHERE rn = 1;
    

    DEMO

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 1970-01-01
      • 2012-07-16
      • 2013-12-28
      • 2014-09-17
      • 2017-03-19
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多