所以基本上我有多个查询来获取标记在不同类别下的数据,它返回给定日期时间之前的最后 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 个,除非有一种很好的方法可以让它发挥作用?
非常感谢!
将
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