Order by 如何不与 partition by 一起使用?

Posted

技术标签:

【中文标题】Order by 如何不与 partition by 一起使用?【英文标题】:How Order by is not working with partion by? 【发布时间】:2019-11-11 12:02:44 【问题描述】:
select a.* 
from (
  select lname,
         lstatus,
         ltime,
         lid,
         row_number() over(partition by ltime,lstatus,lid order by ltime desc) as rm 
  from sortdata
) 
a where a.rm=1;

上面查询的结果是:

jo  doc 10/10/2019  211 1
jo  doc 11/10/2019  211 1
jo  roc 12/10/2019  211 1
jo  woc 13/10/2019  211 1

虽然 ltime 的数据类型是 dat ,请提出建议。

【问题讨论】:

请说明您想要什么结果。 问题不清楚。你能分享一个你期望的示例输入和输出吗? 您想要每个日期、状态和 ID 一行吗?如果是这样,分区中的trunc(ltime) 应该会给你你想要的。 【参考方案1】:

修复partition by。如果你想要每个lid 一行:

select a.*
from (select lname, lstatus, ltime, lid,
             row_number() over( partition by lid order by ltime desc) as rn
      from sortdata
     ) a
where a.rn = 1;

通过包含ltime,您将分区大小限制为一行。因此,分区中所有行的row_number() 值为1(只有其中之一)。

【讨论】:

以上是关于Order by 如何不与 partition by 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Snowflake sql 中使用 partition by 和 order by 计算不同的值?

row_number() over(partition by a order by b desc) rn 用法

如何在 over 函数中使用 partition by 和 order by?

select over partition by ... order by .. used long time

如何应用:大查询中的count(distinct ...)超过(partition by ... order by)?

如何与“row_number() over (partition by [Col] order by [Col])”相反