mysql - 在 SQL 中显示较低值和较高值的数量

标签 mysql sql mariadb

我在尝试创建 SQL 时遇到了一些问题。我有一个具有以下格式和数据的表格。

<表类=“s-表”> <标题> 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

我的目标是做这样的事情:

<表类=“s-表”> <标题> id 较低 更高 <正文> 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 个查询。我知道这也许不是一个大问题但是 有没有办法以某种方式组合这两个查询?

最佳答案

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

相关文章:

从备份文件恢复Mysql

mysql选择两个表中不同的记录

php - PHP脚本中FOREIGN KEY SQL语法错误

php - MySQL 从 ID 最小的列中选择列

mysql - RPG 任务 - 查询玩家数据

sql - 在关系数据库中存储分层数据有哪些选项?

mysql - SQL 中的 NHL 排名

java - 字符变化列的自定义转换器 - from 方法中的参数为 null

java - 如何处理PreparedStatement中的单引号?

mysql - 创建日期/上次更新日期设置为 0000-00-00 00 :00:00 in grails when using mariaDb galera cluster