我正在尝试使用 JDBC 从 Teradata 获取大量记录。我需要将这个集合分解为我在选择中使用“Top N”子句的部分。但我不知道如何设置“偏移”,就像我们在MySQL中所做的那样-
SELECT * FROM tbl LIMIT 5,10
这样下一个 select 语句将从第 (N+1) 个位置获取记录。
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 之间的客户。
您还可以ROW_NUMBER
在 Teradata 上使用窗口聚合。
SELECT ROW_NUMBER() OVER (ORDER BY custID) AS RowNum_
, custID
FROM myDatabase.myCustomers
QUALIFY RowNum_ BETWEEN 900 and 1000;
与RANK
windows 聚合不同,ROW_NUMBER
它将为您提供一个序列,无论您在可选分区集上排序的列是否唯一。
只是另一个需要考虑的选择。