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
)
我正在寻找在特定字段中选择包含前 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
)