确定性排序顺序窗口功能(Deterministic sort order for window fu

2019-10-23 14:02发布

我有一个status表,我想获取最新信息。

Slno |   ID | Status | date
  1  |   1  | Pass   | 15-06-2015 11:11:00 - this is inserted first
  2  |   1  | Fail   | 15-06-2015 11:11:00 - this is inserted second 
  3  |   2  | Fail   | 15-06-2015 12:11:11 - this is inserted first
  4  |   2  | Pass   | 15-06-2015 12:11:11 - this is inserted second

我使用的窗口函数与partition by ID order by date desc来获取第一值。
除外输出:

2  |   1  | Fail   | 15-06-2015 11:11:00 - this is inserted second
4  |   2  | Pass   | 15-06-2015 12:11:11 - this is inserted second

实际输出:

1  |   1  | Pass   | 15-06-2015 11:11:00 - this is inserted first
3  |   2  | Fail   | 15-06-2015 12:11:11 - this is inserted first

根据[ http://docs.aws.amazon.com/redshift/latest/dg/r_Examples_order_by_WF.html] ,添加第二ORDER BY列的窗函数可以解决该问题。 但是,我没有任何其他的列来区分行!
有没有办法解决这个问题的另一种方法?

编辑:我添加slno这里清晰。 我没有slno这样的表!

我的SQL:

with range as (
  select id from status where date between 01-06-2015 and 30-06-2015
), latest as ( 
  select status, id, row_number() OVER (PARTITION BY id ORDER BY date DESC) row_num
)
select * from latest where row_num = 1

Answer 1:

如果你没有slno在你的表,那么你没有哪一行是第一次插入任何可靠的信息。 有在表中没有自然顺序,行的物理顺序可以改变任何时间(与任何更新,或与VACUUM等)

由内部顺序:你可以使用一个不可靠的伎俩ctid

select *
from  (
   select id, status
        , row_number() OVER (PARTITION BY id
                             ORDER BY date, ctid) AS row_num
   from   status  -- that's your table name??
   where  date >= '2015-06-01'  -- assuming column is actually a date
   and    date <  '2015-07-01'
  ) sub
where  row_num = 1;
  • 在没有哪一行首先出现的任何其他信息(这是一个设计错误 ,首先,解决它!),你可能会试图挽救你可以使用什么内部的元组ID ctid

    • 有序序列生成

    行会按物理顺序开始插入时,但可以改变任何时间与任何写操作表或VACUUM或其他事件。
    这是不得已的措施,这打破。

  • 你提出的查询是无效的在几个方面:1中缺少CTE列名,在第二CTE缺少表名,...

  • 你并不需要一个CTE这一点。

用更简单的DISTINCT ON (注意事项ctid应用相同的):

SELECT DISTINCT ON (id)
       id, status
FROM   status
WHERE  date >= '2015-06-01'
AND    date <  '2015-07-01'
ORDER  BY id, date, ctid;
  • 选择由组中每组第一排?


文章来源: Deterministic sort order for window functions