【发布时间】:2018-03-18 10:57:04
【问题描述】:
要为每个类别选择 N 条记录,可以这样做:
SELECT category, category_id, value FROM
(
SELECT category, value, row_number() OVER (PARTITION by category) as category_id
FROM myTable
)
WHERE category_id < N;
内部 SELECT 将首先对每个类别的记录进行分区,并为每个类别的每个记录分配一个名为 category_id 的 ID。 然后,外部查询将使用 category_id 来限制它查询每个类别的记录数。
这在 BIG 表上效率极低,因为即使我们只对每个类别的 N 条记录感兴趣,它也会为所有记录分配 id。
以下内容不适用于我正在使用的 sql 引擎 - 不确定它是否适用于任何引擎。
SELECT category, value, row_number() OVER (PARTITION by category) as category_id
FROM myTable
WHERE category_id < N
有谁知道以更好的时间复杂度实现这一目标的任何其他方法?
更多想法:
针对上述查询对以下算法进行时间分析可能会提供有关查询如何在后台运行的更多见解:
1. SELECT DISTINCT(category) FROM myTable
2. FOREACH category SELECT N rows
更多信息:
我的数据由category 物理分区,能够显式利用这将是有用的
【问题讨论】:
-
即使您的第二个查询可以在某些 RDBMS 上运行,执行计划也可能与第一个相同
-
您可以尝试将派生表转储到#temp 并在其上创建索引,然后查询它
-
用您正在使用的数据库标记您的问题。
-
@LONG 要动态转储到临时表中(保证每个类别至少包含 N 条记录),我将需要执行类似的查询。如果您知道另一种方法,请在答案中写出来。
-
您的示例查询没有多大意义——您返回的
n行每行都包含相同的值 (category),您不妨硬编码它。你能用更现实的查询更新问题吗?
标签: sql select db2 partition bigsql