显示 SQL 中较低值和较高值的数量
Show number of lower and higher values in SQL
我在尝试制作 SQL 时遇到了一些问题。我有一个具有以下格式和数据的 table。
id
值
日期
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
降低
更高
12
1
1
5
0
1
这将在特定时间间隔(例如 100 天)中查找最旧行的值,并将其与之后的所有日期进行比较,如果它们的值更高和更低并且 return 计数。
我确实有一些有用的东西,但它需要更多的查询:
一到组取所有日期间隔为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;
我在尝试制作 SQL 时遇到了一些问题。我有一个具有以下格式和数据的 table。
id | 值 | 日期 |
---|---|---|
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 | 降低 | 更高 |
---|---|---|
12 | 1 | 1 |
5 | 0 | 1 |
这将在特定时间间隔(例如 100 天)中查找最旧行的值,并将其与之后的所有日期进行比较,如果它们的值更高和更低并且 return 计数。
我确实有一些有用的东西,但它需要更多的查询: 一到组取所有日期间隔为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;