【问题标题】:Show number of lower and higher values in SQL在 SQL 中显示较低和较高值的数量
【发布时间】: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 子句,看看它是否有效。

标签: mysql sql mariadb


【解决方案1】:

使用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;

【讨论】:

  • @Slavian 。 . .只需在子查询中添加 where 子句即可。逻辑并没有真正改变。
  • where 子句需要进入内部查询 FYI。
  • @GordonLinoff 是的,我做到了,我只是不熟悉 first_value,按事物分区,因为我以前从未使用过它们。非常感谢 :D 我觉得自己非常愚蠢,应该更多地关注我的 SQL。
猜你喜欢
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多