显示 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;