Sql Teradata--使用排名进行限定,但不提供准确的结果

Sql Teradata--使用排名进行限定,但不提供准确的结果,sql,teradata,Sql,Teradata,我遇到了一个问题,我需要基于maxlast_updated_日期的columnREVISION的两个最新值 情景: 每个零件列对应一个修订列“硬件零件”。只要零件有任何更改,修订版就会更改,最后更新的日期也会更改。修订可以是任何数字、字母等 假设我有100个零件,60个零件不变,40个零件不变。因此40将至少有两个最新版本。输出中总共有60+40*2=140个部件 如果不使用Qualife,我将获得超过500万个不同的部件。所以,在没有任何零件经过任何修改的情况下,我至少应该得到500万份记录

我遇到了一个问题,我需要基于maxlast_updated_日期的columnREVISION的两个最新值

情景:

每个零件列对应一个修订列“硬件零件”。只要零件有任何更改,修订版就会更改,最后更新的日期也会更改。修订可以是任何数字、字母等

假设我有100个零件,60个零件不变,40个零件不变。因此40将至少有两个最新版本。输出中总共有60+40*2=140个部件

如果不使用Qualife,我将获得超过500万个不同的部件。所以,在没有任何零件经过任何修改的情况下,我至少应该得到500万份记录

SELECT DISTINCT FROM_NAME
FROM(
select
CDR_ODS_R_GE_OBJ_HST .FROM_ID as FROM_ID,
CDR_ODS_R_GE_OBJ_HST .FROM_NAME as FROM_NAME  ,
CDR_ODS_R_GE_OBJ_HST .FROM_REVISION as FROM_REVISION,
max(CDR_ODS_R_GE_OBJ_HST .LAST_UPDATE_DATE) as LAST_UPDATE_DATE
--RANK( )  OVER ( ORDER BY max(CDR_ODS_R_GE_OBJ_HST .LAST_UPDATE_DATE) DESC) AS RANK1
from GEEDW_PLM_ODS_BULK_V.CDR_ODS_R_GE_OBJ_HST CDR_ODS_R_GE_OBJ_HST
--WHERE CDR_ODS_R_GE_OBJ_HST.FROM_name='323A4747UUP15A' 
--QUALIFY RANK1<=2 
group by 1,2,3
) TM

您需要添加一个PRATITION BY,否则它将在所有部分上排名。在你的例子中,186个零件具有相同的最大日期,所有零件都具有相同的排名1,下一个排名是187

顺便说一句,你确定你需要这个小组吗?可能您将其与旧的不推荐使用的RANK语法相混淆,其中使用了groupby而不是PARTITION。这可能会更有效地返回相同的结果:

select
   CDR_ODS_R_GE_OBJ_HST .FROM_ID as FROM_ID,
   CDR_ODS_R_GE_OBJ_HST .FROM_NAME as FROM_NAME  ,
   CDR_ODS_R_GE_OBJ_HST .FROM_REVISION as FROM_REVISION,
   CDR_ODS_R_GE_OBJ_HST .LAST_UPDATE_DATE as LAST_UPDATE_DATE
  ,RANK( )
   OVER (PARTITION BY FROM_NAME
         ORDER BY max(CDR_ODS_R_GE_OBJ_HST.LAST_UPDATE_DATE) DESC) AS RANK1
from GEEDW_PLM_ODS_BULK_V.CDR_ODS_R_GE_OBJ_HST CDR_ODS_R_GE_OBJ_HST
--WHERE CDR_ODS_R_GE_OBJ_HST.FROM_name='323A4747UUP15A' 
QUALIFY RANK1<=2

谢谢你的回复。对不起,我无法回复。是的,你完全正确,我错过了一个分区。我可以通过使用partition by来获得它。
select FROM_NAME,FROM_REVISION, LAST_UPDATE_DATE
from GEEDW_PLM_ODS_BULK_V.CDR_ODS_R_GE_OBJ_HST CDR_ODS_R_GE_OBJ_HST


0024    301345498360631 1/24/2014 11:22:17
0024    431365606243002 12/16/2013 20:16:44
0024    491333037555534 6/6/2013 18:08:51
select
   CDR_ODS_R_GE_OBJ_HST .FROM_ID as FROM_ID,
   CDR_ODS_R_GE_OBJ_HST .FROM_NAME as FROM_NAME  ,
   CDR_ODS_R_GE_OBJ_HST .FROM_REVISION as FROM_REVISION,
   max(CDR_ODS_R_GE_OBJ_HST .LAST_UPDATE_DATE) as LAST_UPDATE_DATE
  ,RANK( )
   OVER (PARTITION BY FROM_NAME
         ORDER BY max(CDR_ODS_R_GE_OBJ_HST.LAST_UPDATE_DATE) DESC) AS RANK1
from GEEDW_PLM_ODS_BULK_V.CDR_ODS_R_GE_OBJ_HST CDR_ODS_R_GE_OBJ_HST
--WHERE CDR_ODS_R_GE_OBJ_HST.FROM_name='323A4747UUP15A' 
group by 1,2,3
QUALIFY RANK1<=2
select
   CDR_ODS_R_GE_OBJ_HST .FROM_ID as FROM_ID,
   CDR_ODS_R_GE_OBJ_HST .FROM_NAME as FROM_NAME  ,
   CDR_ODS_R_GE_OBJ_HST .FROM_REVISION as FROM_REVISION,
   CDR_ODS_R_GE_OBJ_HST .LAST_UPDATE_DATE as LAST_UPDATE_DATE
  ,RANK( )
   OVER (PARTITION BY FROM_NAME
         ORDER BY max(CDR_ODS_R_GE_OBJ_HST.LAST_UPDATE_DATE) DESC) AS RANK1
from GEEDW_PLM_ODS_BULK_V.CDR_ODS_R_GE_OBJ_HST CDR_ODS_R_GE_OBJ_HST
--WHERE CDR_ODS_R_GE_OBJ_HST.FROM_name='323A4747UUP15A' 
QUALIFY RANK1<=2