oracle 如何在某个日期的至少两个记录具有相同的持续时间或至少一个记录具有0持续时间时标记该日期的所有记录

7tofc5zh  于 2023-06-05  发布在  Oracle
关注(0)|答案(2)|浏览(300)

当有相同的持续时间或至少有一个记录的持续时间为0时,我需要标记记录的日期。CODE SH是要匹配的持续时间,或者如果另一个记录的持续时间为0。正在分析的示例记录:
| 日期|代码|持续时间|
| - -----|- -----|- -----|
| 23年4月2日|AB| 510|
| 23年4月2日|SH| 510|
| 23年4月2日|B2|十五|

也有0

| 日期|代码|持续时间|
| - -----|- -----|- -----|
| 23年4月2日|AB| 0|
| 23年4月2日|SH| 510|
| 23年4月2日|B2|十五|

期待这个:

| 日期|代码|持续时间|FLAG|
| - -----|- -----|- -----|- -----|
| 23年4月2日|AB| 510| Y轴|
| 23年4月2日|SH| 510| Y轴|
| 23年4月2日|B2|十五|Y轴|

| 日期|代码|持续时间|FLAG|
| - -----|- -----|- -----|- -----|
| 23年4月2日|AB| 0| Y轴|
| 23年4月2日|SH| 510| Y轴|
| 23年4月2日|B2|十五|Y轴|
我打算做一个分析函数,用代码和日期作为分区来计算记录。
count(1) over (partition by date,code,duration)
但后来我意识到我怎么处理0呢谢谢你的帮助

hmae6n7t

hmae6n7t1#

可以使用count和min窗口函数,如下所示:

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

fcipmucu

fcipmucu2#

我有点累了,所以可能有一个更简单的方法,我现在看不到,但你可以交叉SH和非SH的日期/持续时间,然后添加持续时间为零的日期。

select date, code, duration
from mytable
where date in
(
  select date from
  (
    select date, duration
    from mytable
    where code = 'SH'
    intersect
    select date, duration
    from mytable
    where code <> 'SH'
    union all
    select date, duration
    from mytable
    where duration = 0
  )
);

select date, code, duration
from mytable t
where exists
(
  select date, duration
  from mytable t2
  where t2.date = t.date and t2.code = 'SH'
  intersect
  select date, duration
  from mytable t3
  where t3.date = t.date and t3.code <> 'SH'
)
or date in
(
  select date
  from mytable
  where duration = 0
);

相关问题