Sql 使用窗口函数和过滤器向所有行返回1个特定值
我需要时间戳满足:order_day='4th'在1列中显示 类似这样的数据称为“t1”:Sql 使用窗口函数和过滤器向所有行返回1个特定值,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,我需要时间戳满足: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
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
对于order\u day
,只有1个'4th'
,所以使用max()或min()
显示相同的结果。有办法吗
我问了一个稍微相同的问题,但使用
min()
您可以使用相关子查询作为替代-
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
请记住,这些只是可选选项,您需要选择最适合您的情况的选项。为什么不使用
min()
(或max()
),而它会产生您想要的结果?因为我认为它应该有另一种方法@GMBEX:I使用:(当order_day='4th'然后timestamp else null end)超过(…)
不起作用并且不使用min():时间戳过滤器()超过()
将导致语法错误我认为窗口min()
(或max()
)是这里的最佳方法。例如:我使用:(当order_day='4th'然后timestamp else null end)超过(…)
不工作且未使用min():时间戳过滤器()覆盖()
将导致语法错误@GMB