7

我正在尝试使用 JDBC 从 Teradata 获取大量记录。我需要将这个集合分解为我在选择中使用“Top N”子句的部分。但我不知道如何设置“偏移”,就像我们在MySQL中所做的那样-

   SELECT * FROM tbl LIMIT 5,10

这样下一个 select 语句将从第 (N+1) 个位置获取记录。

4

2 回答 2

7

RANK 和 QUALIFY 我相信是你的朋友

例如

 SEL RANK(custID), custID 
 FROM mydatabase.tblcustomer
 QUALIFY RANK(custID) < 1000 AND RANK(custID) > 900
 ORDER BY custID;

RANK(field) 将(概念上)检索结果集中的所有行,按 ORDER BY 字段对它们进行排序,并为它们分配一个递增的排名 ID。

QUALIFY 允许您通过限制返回到限定表达式的行来对其进行切片,现在可以合法地查看 RANK。

需要明确的是,我返回查询中的第 900-1000 行 select all from cusotmers,而不是返回 ID 介于 900 和 1000 之间的客户。

于 2011-09-05T13:09:58.773 回答
6

您还可以ROW_NUMBER在 Teradata 上使用窗口聚合。

SELECT ROW_NUMBER() OVER (ORDER BY custID) AS RowNum_
     , custID
  FROM myDatabase.myCustomers
QUALIFY RowNum_ BETWEEN 900 and 1000;

RANKwindows 聚合不同,ROW_NUMBER它将为您提供一个序列,无论您在可选分区集上排序的列是否唯一。

只是另一个需要考虑的选择。

于 2011-09-06T13:24:19.677 回答