我需要标记一个日期的记录,当有相同的持续时间或至少有一个记录有0持续时间.代码SH是与之匹配的持续时间,或者如果另一个记录的持续时间为0.正在分析的记录示例:

Date Code Duration
4/2/23 AB 510
4/2/23 SH 510
4/2/23 B2 15

also with 0

Date Code Duration
4/2/23 AB 0
4/2/23 SH 510
4/2/23 B2 15

Expect this:

Date Code Duration FLAG
4/2/23 AB 510 Y
4/2/23 SH 510 Y
4/2/23 B2 15 Y

Date Code Duration FLAG
4/2/23 AB 0 Y
4/2/23 SH 510 Y
4/2/23 B2 15 Y

我打算做一个分析函数,它使用代码和日期作为分区来计算记录.

count(1) over (partition by date,code,duration)

但后来我意识到我也该怎么对付0岁的S?谢谢你的帮助.

推荐答案

您可以使用计数和最小窗口函数,如下所示:

with t as 
(
  select tb.*,
      count(*)  over  (partition by date_, code, Duration) cnt,
      min(Duration) over (partition by date_, code) min_dur
  from tbl tb
) 
select t.date_, t.code, t.duration,
  case 
    when min_dur = 0 or -- there is a 0 duration
         max(cnt) over (partition by date_, code) > 1 -- when there are the same durations in multiple rows. 
    then 'Y' else 'N'
  end as flg
from t

demo

Sql相关问答推荐

从原始表列中经过JSON字符串化的对象数组构建视图

值对于类型字符来说太长

PostgreSQL:按小时查看调整日期

正在编写查询.我需要将订阅的时间段分为第一个订阅中包含的另一个订阅之前和之后的时间段

每小时 Select 1行

在Netezza SQL中将字符DataType转换为整型DataType

按属性值 Select 数组元素Postgres Jsonb

SQL将三个表中的三列组合为一列

SQL:如果一个表中的日期在另一个表的日期的12个月内,则为是或否

如何使用SQL生成数据的滚动3天总和

MySQL中的递归查询邻接表深度优先?

SQL的左连接在多对多关系情况下使用

SQL 按 id 运行总计并受条件限制(在窗口上)

如何将特定值从 JSON 列中的一个字段移动到 PostgreSQL 中的另一个字段?

根据是否存在值组合分组并 Select 行

SQL:如何从时间戳数据生成时间序列并计算不同事件类型的累计总和?

Postgres 条件求和函数

如何跨行合并以删除 SQL 中的空值?

有条件求和

为什么这是 AND,OR with NULL 的真值表?