按时间戳排序似乎不适用于同一日期的记录

问题描述 投票:0回答:1
with
--my input--
x(id1,med_id,dt,dt_tm,casemgr_id,casemgr_clntid,status) as (
select 123456,98410,date'2024-04-19',timestamp'2024-04-19 09:00:00',12345,67891,-2
union all
select 194567,98410,date'2024-04-19',timestamp'2024-04-19 11:00:00',12345,67891,-2
union all
select 789101,98410,date'2024-04-24',timestamp'2024-04-24 09:00:00',12345,67891,-2
union all
select 194587,98410,date'2024-04-25',timestamp'2024-04-25 09:00:00',12345,67891,-2
union all
select 234561,98410,date'2024-04-26',timestamp'2024-04-26 09:00:00',12345,67891,-2
union all
select 456789,91956,date'2024-04-19',timestamp'2024-04-19 08:00:00',99012,87567,-2
union all
select 998415,91956,date'2024-12-20',timestamp'2024-12-20 07:00:00',99012,87567,-2
);

在上面输入。这是我正在运行的下面的代码,但我的目标是,如果记录在同一天,就像前两个实例一样,较早的记录应该有效,因为它的时间戳较早,而另一个记录应该无效,因为它位于较晚的时间戳中。也就是说,上午 9 点的第一条记录应该是有效的,而第二条记录应该是无效的。但我当前的下面的代码不起作用,因为两条记录都显示为有效,这不是我想要的输出。不确定我在下面的代码中做错了什么。请帮忙。

-- my sql qry ...
SELECT
  id1
, med_id
, dt
,dt_tm
, casemgr_id
, casemgr_clntid
, CASE WHEN (
           dt -
         , FIRST_VALUE(dt) OVER(PARTITION BY med_id, casemgr_clntid ORDER BY dt_tm)
         )  > 180
      OR (
           dt-
         , FIRST_VALUE(dt) OVER(PARTITION BY med_id, casemgr_clntid ORDER BY dt_tm)
         )  = 0
    THEN 'valid'
    ELSE 'invalid'
  END AS status
FROM x
ORDER BY med_id, casemgr_clntid, dt_tm 
;

我也尝试用 dt_tm 进行减法,但是 dt_tm-first_value(dt_tm) 不起作用。

错误:无效操作

with
    --my desired output--
    x(id1,med_id,dt,dt_tm,casemgr_id,casemgr_clntid,status) as (
    select 123456,98410,date'2024-04-19',timestamp'2024-04-19 09:00:00',12345,67891, 'valid'
    union all
    select 194567,98410,date'2024-04-19',timestamp'2024-04-19 11:00:00',12345,67891,'invalid'
    union all
    select 789101,98410,date'2024-04-24',timestamp'2024-04-24 09:00:00',12345,67891,'invalid'
    union all
    select 194587,98410,date'2024-04-25',timestamp'2024-04-25 09:00:00',12345,67891,'invalid'
    union all
    select 234561,98410,date'2024-04-26',timestamp'2024-04-26 09:00:00',12345,67891,'invalid'
    union all
    select 456789,91956,date'2024-04-19',timestamp'2024-04-19 08:00:00',99012,87567,'valid'
    union all
    select 998415,91956,date'2024-12-20',timestamp'2024-12-20 07:00:00',99012,87567,'valid'
    );
sql teradata
1个回答
0
投票

您需要 LAG 并检查 NULL,它标记第一个值,该值是有效的,并且您还需要检查一天是否已经过去,您用 >0 进行检查

with
--my input--
x(id1,med_id,dt,dt_tm,casemgr_id,casemgr_clntid,status) as (
select 123456,98410,date'2024-04-19',timestamp'2024-04-19 09:00:00',12345,67891,-2
union all
select 194567,98410,date'2024-04-19',timestamp'2024-04-19 11:00:00',12345,67891,-2
union all
select 789101,98410,date'2024-04-24',timestamp'2024-04-24 09:00:00',12345,67891,-2
union all
select 194587,98410,date'2024-04-25',timestamp'2024-04-25 09:00:00',12345,67891,-2
union all
select 234561,98410,date'2024-04-26',timestamp'2024-04-26 09:00:00',12345,67891,-2
union all
select 456789,91956,date'2024-04-19',timestamp'2024-04-19 08:00:00',99012,87567,-2
union all
select 998415,91956,date'2024-12-20',timestamp'2024-12-20 07:00:00',99012,87567,-2
)
SELECT
  id1
, med_id
, dt
,dt_tm
, casemgr_id
, casemgr_clntid
, CASE WHEN (
           dt -
          LAG(dt) OVER(PARTITION BY med_id, casemgr_clntid ORDER BY dt_tm)
         )  IS NULL
      OR (
           dt-
          LAG(dt) OVER(PARTITION BY med_id, casemgr_clntid ORDER BY dt_tm)
         )  
  > 0
    THEN 'valid'
    ELSE 'invalid'
  END AS status
FROM x
ORDER BY med_id, casemgr_clntid, dt_tm 
;
id1 med_id dt dt_tm casemgr_id casemgr_clntid 状态
456789 91956 2024-04-19 2024-04-19 08:00:00 99012 87567 有效
998415 91956 2024-12-20 2024-12-20 07:00:00 99012 87567 有效
123456 98410 2024-04-19 2024-04-19 09:00:00 12345 67891 有效
194567 98410 2024-04-19 2024-04-19 11:00:00 12345 67891 无效
789101 98410 2024-04-24 2024-04-24 09:00:00 12345 67891 有效
194587 98410 2024-04-25 2024-04-25 09:00:00 12345 67891 有效
234561 98410 2024-04-26 2024-04-26 09:00:00 12345 67891 有效
SELECT 7

但是这种方法更短,因为你没有更多的标准

with
--my input--
x(id1,med_id,dt,dt_tm,casemgr_id,casemgr_clntid,status) as (
select 123456,98410,date'2024-04-19',timestamp'2024-04-19 09:00:00',12345,67891,-2
union all
select 194567,98410,date'2024-04-19',timestamp'2024-04-19 11:00:00',12345,67891,-2
union all
select 789101,98410,date'2024-04-24',timestamp'2024-04-24 09:00:00',12345,67891,-2
union all
select 194587,98410,date'2024-04-25',timestamp'2024-04-25 09:00:00',12345,67891,-2
union all
select 234561,98410,date'2024-04-26',timestamp'2024-04-26 09:00:00',12345,67891,-2
union all
select 456789,91956,date'2024-04-19',timestamp'2024-04-19 08:00:00',99012,87567,-2
union all
select 998415,91956,date'2024-12-20',timestamp'2024-12-20 07:00:00',99012,87567,-2
)
SELECT
  id1
, med_id
, dt
,dt_tm
, casemgr_id
, casemgr_clntid
, CASE WHEN (
           dt -
          LAG(dt) OVER(PARTITION BY med_id, casemgr_clntid ORDER BY dt_tm)
         )  = 0
      
  THEN 'invalid'
    ELSE 'valid'
  END AS status
FROM x
ORDER BY med_id, casemgr_clntid, dt_tm 
;
id1 med_id dt dt_tm casemgr_id casemgr_clntid 状态
456789 91956 2024-04-19 2024-04-19 08:00:00 99012 87567 有效
998415 91956 2024-12-20 2024-12-20 07:00:00 99012 87567 有效
123456 98410 2024-04-19 2024-04-19 09:00:00 12345 67891 有效
194567 98410 2024-04-19 2024-04-19 11:00:00 12345 67891 无效
789101 98410 2024-04-24 2024-04-24 09:00:00 12345 67891 有效
194587 98410 2024-04-25 2024-04-25 09:00:00 12345 67891 有效
234561 98410 2024-04-26 2024-04-26 09:00:00 12345 67891 有效
SELECT 7
© www.soinside.com 2019 - 2024. All rights reserved.