我正在寻找在某些字段中选择包含前N个值的行的方法。例如,我想在表格中选择最新日期和第二日期到最晚日期的行。所以,我可以使用它:
SELECT F1, F2, F3, report_date FROM My_Table
WHERE report_date = (SELECT MAX(report_date) from My_Table)
OR report_date = (
SELECT MAX(report_date from My_Table
WHERE report_date < (SELECT MAX(report_date) FROM My_Table)
)
好的,它按预期工作。但是,对于前5个日期,代码将非常复杂。我尝试过这样的事情:
Select * from AL_CHECKER
where REPORT_DATE in (
select top 2 MAX(REPORT_DATE) from AL_CHECKER order by max(report_date) desc
)
但我刚刚得知子查询中不支持TOP N.那么,支持什么以及如何使尽可能容易阅读?
答案 0 :(得分:2)
您可以在Teradata中使用窗口函数和子查询或qualify
:
select t.*
from my_table t
qualify row_number() over (order by date desc) <= 5;
如果您想加入关系,可以使用rank()
或dense_rank()
。
或者,您可以使用top
:
select top 5 t.*
from my_table t
order by date desc;
答案 1 :(得分:0)
戈登的查询就是这样......它会给你带有“前5”(即最大)日期值的行。
如果您想根据其他列中的其他值进行排序,只需更改ORDER BY字段和sort_order(ASC / DESC)
答案 2 :(得分:0)
使用DENSE_RANK
代替ROW_NUMBER
的戈登查询按预期工作。
关于子查询错误不支持 Top N选项,有一种解决方法。它明确声明子查询(因为它可能是相关的),但没有提及派生表,因此将子查询嵌套在派生表中可以工作:
SELECT *
FROM AL_CHECKER
WHERE report_date IN
(
SELECT *
FROM
(
SELECT TOP 2 report_date
FROM AL_CHECKER
GROUP BY 1
ORDER BY 1
) AS dt
)