【问题标题】:Return 1 specific value to all row using Window Function and Filter使用窗口函数和过滤器将 1 个特定值返回到所有行
【发布时间】:2020-08-18 09:34:48
【问题描述】:

我需要时间戳满足:order_day = '4th' 显示在 1 列中

这样的数据称为“t1”:

timestamp id   order_day 
day 9     id1  5th
day 8     id1  4th
day 7     id1  3th
day 6     id1  2th
day 5     id1  1th

想要的结果:

timestamp id   order_day  info
day 9     id1  5th        day 8
day 8     id1  4th        day 8
day 7     id1  3rd        day 8
day 6     id1  2nd        day 8
day 5     id1  1st        day 8

目前我使用:

select *,
min(timestamp) filter (where order_day = '4th') over (partition by id) as info
from t1

但我不想使用min(),因为这不是我的目的,因为每个id 只有1 个'4th' 对应order_day,所以使用max() or min() 显示相同的结果。有什么办法吗?

我问了一个有点相同但使用min()here的问题

【问题讨论】:

  • 你为什么不使用min()(或max()),而它会产生你想要的结果?
  • 因为我认为它应该有另一种方式来达到这个目的@GMB
  • EX:我使用 :(case when order_day = '4th' then timestamp else null end) over (...) 不起作用,不使用 min() :timestamp filter () over () 会导致语法错误
  • 我认为窗口min()(或max())是这里最好的方法。
  • EX:我使用 :(case when order_day = '4th' then timestamp else null end) over (...) 不起作用并且不使用 min() :timestamp filter () over () 会导致语法错误@GMB

标签: sql postgresql window-functions


【解决方案1】:

您可以使用相关子查询作为替代方案-

select A.*,
(select timestamp from t1 B where B.order_day = '4th' AND B.id = A.id) as info
from t1 A

另一种选择是-

select A.imestamp,
A.id,
A.order_day,
B.timestamp as info
from t1 A 
inner join (
    select id, timestamp 
    from t1 
    where order_day = '4th'
) B
on A.id = B.id

请记住,这些只是替代选项,您需要选择最适合您情况的选项。

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 2023-03-20
    • 2016-11-19
    • 1970-01-01
    • 2021-05-08
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多