Select WHERE 中的前 N ​​个值

Select TOP N values in WHERE

我正在寻找在特定字段中选择包含前 N 个值的行的方法。例如,我想为 table 中的最新日期和倒数第二个日期选择行。所以,我可以使用它:

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。那么,支持什么以及如何使阅读尽可能容易?

您将在 Teradata 中使用 window 函数和子查询或 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;

Gordon 的查询就是这样做的...它将为您提供具有 "top 5"(即最大)日期值的行。

如果您想根据不同列中的其他值进行排序,只需更改 ORDER BY 字段和 sort_order (ASC/DESC)

Gordon 使用 DENSE_RANK 而不是 ROW_NUMBER 的查询按预期工作。

关于 Top N option is not supported in subquery 错误,有一个解决方法。它明确指出 Subquery(因为它可能是 Correlated),但没有提到 Derived Tables,因此将子查询嵌套在派生 Table 作品:

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
 )