我在尝试创建 SQL 时遇到了一些问题。我有一个具有以下格式和数据的表格。
我的目标是做这样的事情:
这会查找特定时间间隔(例如 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 个查询。我知道这也许不是一个大问题但是 有没有办法以某种方式组合这两个查询?
最佳答案
使用first_value()
:
select id,
sum(value < value_1) as lower,
sum(value > value_1) as higher
from (select t.*,
first_value(value) over (partition by id order by date) as value_1
from t
) t
group by id;
关于mysql - 在 SQL 中显示较低值和较高值的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68224703/