在WHERE

时间:2017-11-22 12:22:50

标签: sql teradata

我正在寻找在某些字段中选择包含前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.那么,支持什么以及如何使尽可能容易阅读?

3 个答案:

答案 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
 )