【发布时间】:2021-07-02 11:50:57
【问题描述】:
我在尝试编写 SQL 时遇到了一些问题。我有一个表格,格式和数据如下。
| id | value | date |
|---|---|---|
| 12 | 3 | 2020-06-01 |
| 12 | 4 | 2020-06-09 |
| 12 | 1 | 2020-06-20 |
| 5 | 4 | 2020-06-11 |
| 5 | 5 | 2020-06-17 |
我的目标是做这样的事情:
| id | lower | higher |
|---|---|---|
| 12 | 1 | 1 |
| 5 | 0 | 1 |
这会在特定间隔(例如 100 天)中查找最旧行的值,并将其与之后的所有日期进行比较,如果它们的值更高或更低并返回计数。
我确实有一些可行的方法,但它需要更多查询: 一组取所有日期间隔为 xx 天的 id
SELECT id FROM table
WHERE date >= CURDATE() - INTERVAL 30 DAY GROUP BY id
ORDER BY id ASC;
然后我循环遍历每一行并获取其较低和较高的值。
SELECT
*
FROM
(
SELECT
COUNT(*) AS higher, id
FROM
`table`
WHERE
id = 12 AND date > CURDATE() - INTERVAL 30 DAY AND value > (
SELECT value FROM table
WHERE table.date >= CURDATE() - INTERVAL 30 DAY AND id = 12
ORDER BY `table`.`date` ASC LIMIT 1
)
) AS t1,(
SELECT
COUNT(*) AS deteriorated_placements
FROM
`table`
WHERE
id = 12 AND date > CURDATE() - INTERVAL 30 DAY AND value < (
SELECT value FROM table
WHERE table.date >= CURDATE() - INTERVAL 30 DAY AND id = 12
ORDER BY `table`.`date` ASC LIMIT 1
)
) AS t2;
问题在于我又做了大约 40 个查询。我知道这可能不是一个大问题,但 有没有办法以某种方式组合这两个查询?
【问题讨论】:
-
可以使用窗口函数吗?
-
@SalmanA 是的,我愿意。我认为给定的答案会对我有所帮助,我只需要添加一个 where 子句,看看它是否有效。