【发布时间】:2014-03-28 21:55:49
【问题描述】:
假设我们有下表:
CREATE TABLE "ARTICLE_COUNTER_STATISTICS_M"
(
"ID" NUMBER(19,0) NOT NULL ENABLE,
"ITEMCOUNT" NUMBER(19,0),
"VERSION" TIMESTAMP (6) DEFAULT SYSTIMESTAMP
)
唯一约束是在 ID 和 VERSION 字段上。
可能在 DB 中的某些行的示例(所有记录的时间戳始终相同):
1374659422641 22 2014.02.26 09:45:01,000000000
1387797258001 7 2014.02.26 09:45:01,000000000
1387796687862 1 2014.02.26 09:45:01,000000000
1387800521317 1 2014.02.26 09:45:01,000000000
现在,如果我们要选择 ID、itemcount 并按 itemcount 排序,我们将执行以下操作:
SELECT id, SUM(itemcount) as count, version
FROM ARTICLE_COUNTER_STATISTICS_m
WHERE id != '0'
GROUP BY id, version
ORDER BY version DESC, SUM(itemcount) DESC
但不清楚的是,我们如何选择仅在一定范围内的结果。例如,计数最多的 10 到 20 个项目?我试过这样的事情:
SELECT id, count, version FROM(
SELECT id, SUM(itemcount) as count, version
FROM ARTICLE_COUNTER_STATISTICS_m
WHERE id != '0'
GROUP BY id, version
ORDER BY version DESC, SUM(itemcount) DESC
) where rownum >= 0 and rownum <= 20
但如果 "where rownum >= n" 中的 n 大于 1(它只返回空结果),则它不起作用。我知道可能必须使用 ROW_NUMBER() 函数来实现目标,但我无法让它工作。有任何想法吗?谢谢!
【问题讨论】:
-
与您的问题无关,但使用 "WHERE id != '0'" 会严重损害您的性能 - Oracle 会将 ID 列转换为字符串以进行比较。请改用“WHERE id != 0”(不带引号)。
标签: sql oracle pagination rows