sql - 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 |
+----+---------+------+------+-------+
解决方案
您可以使用聚合来获取每个 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 天。
推荐阅读
- arrays - 在 Postman 中取消嵌套 JSON 响应
- c++ - 指向不同大小的成员数组的指针
- repast-simphony - 在 REPAST 中按季度/月汇总输出
- r - 将一行的一个值与同一列的所有行的平均值进行比较
- docker - 我想创建多个容器,然后创建不同的 pod 并将容器放入 pod
- python - match.call() 有什么作用?
- python-3.6 - 执行 cx_Freeze setup.py 后,cmd 中没有任何反应
- python - 使 tfp.sts.fit_with_hmc 更快
- android - 在 RecyclerView 中滑动删除时如何添加具有红色背景颜色的布局
- javascript - 使用 Gulp 从数组中批量重命名图像