组合 SQL 查询

问题描述 投票:0回答:1

所以基本上我有多个查询来获取标记在不同类别下的数据,它返回给定日期时间之前的最后 X 行。每个类别的最大时间戳值都会不同

SELECT * FROM table WHERE category="a" AND timestampCol < timestampValue1 ORDER BY timestampCol DESC LIMIT 3;
SELECT * FROM table WHERE category="b" AND timestampCol < timestampValue2 ORDER BY timestampCol DESC LIMIT 3;
SELECT * FROM table WHERE category="c" AND timestampCol < timestampValue3 ORDER BY timestampCol DESC LIMIT 3;
...

我需要数据库从每个类别返回一组数字。自定义每个类别的 LIMIT 会很好,但这不是必需的,只要我保证从所有类别返回数据即可。

下面的查询将返回前 9 行,这些行可能全部来自类别 a,这不是我想要的,但是我想优化它以作为单个查询运行,因为它可以从最多 8 个类别中提取需要运行大量查询的时间。

SELECT * FROM table WHERE
 (category="a" AND timestampCol < timestampValue1)
 OR (category="b" AND timestampCol < timestampValue2)
 OR (category="c" AND timestampCol < timestampValue3)
ORDER BY timestampCol DESC LIMIT 9;
...

在类别上使用 GROUP BY 只会返回每个类别中的一个而不是 3 个,除非有一种很好的方法可以让它发挥作用?

非常感谢!

sql mariadb
1个回答
0
投票

row_number()
窗口函数添加到您的查询中,按类别分区:

select *
from
(
  SELECT t.*,
         row_number() over (partition by category order by timestampCol DESC) rn
  FROM table t
  WHERE (category="a" AND timestampCol < timestampValue1)
     OR (category="b" AND timestampCol < timestampValue2)
     OR (category="c" AND timestampCol < timestampValue3)
) dt
where rn <= 3
order by category, timestampCol DESC
© www.soinside.com 2019 - 2024. All rights reserved.