首页 > 解决方案 > SQL显示不同日期的值

问题描述

我有一个名为 Reading_Hist 的表,其中包含 Reading、Date、ID 等列。此表包含读数的历史记录。例子

+----+---------+-------------+
| ID | Reading | ReadingDate |
+----+---------+-------------+
|  1 |      12 | 9/12/2018   |
|  2 |      15 | 9/12/2018   |
|  1 |      16 | 9/5/2018    |
|  4 |       1 | 9/12/2018   |
|  3 |      65 | 9/12/2018   |
|  1 |      23 | 8/29/2018   |
|  3 |      25 | 9/5/2018    |
|  2 |      23 | 9/5/2018    |
|  4 |       3 | 9/5/2018    |
+----+---------+-------------+

我想编写一个 sql 来显示每个 ID,它是第一列的当前读数,一周前的下一个读数和两周前的第三个读数以及读数的最后趋势。

下面的示例结果。

+----+---------+------+------+-------+
| ID | Current | Wk_1 | Wk_2 | Trend |
+----+---------+------+------+-------+
|  1 |      12 |   16 | 23   | Down  |
|  2 |      15 |   23 | NULL | Down  |
|  3 |      65 |   25 | NULL | UP    |
|  4 |       1 |    3 | NULL | Down  |
+----+---------+------+------+-------+

标签: sqlsql-servertsql

解决方案


您可以使用聚合来获取每个 ID 的最大读数天数。然后离开加入当前的读数,它们是上周和两周前的。用于CASE计算趋势。

它可能看起来像:

SELECT x.id,
       rh2.reading current,
       rh3.reading wk_1,
       rh4.reading wk_2,
       CASE
         WHEN rh2.reading > rh3.reading THEN
           'Up'
         WHEN rh2.reading < rh3.reading THEN
           'Down'
         WHEN rh2.reading = rh3.reading THEN
           '-'
       END trend
       FROM (SELECT rh1.id,
                    max(rh1.reading_date) reading_date
                    FROM reading_hist rh1
                    GROUP BY rh1.id) x
            LEFT JOIN reading_hist rh2
                      ON rh2.id = x.id
                         AND rh2.reading_date = x.reading_date
            LEFT JOIN reading_hist rh3
                      ON rh3.id = x.id
                         AND rh3.reading_date = dateadd(day, -7, x.reading_date)
            LEFT JOIN reading_hist rh4
                      ON rh4.id = x.id
                         AND rh4.reading_date = dateadd(day, -14, x.reading_date);

当然,这要求读数的最后一天正好是 7 或 14 天。


推荐阅读