比较一个表中的两个日期

cpjpxq1n  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(266)

我有下表

card id | txn id | date | legit
 xys       txq      Mar.1  1
 xys       txs      Mar.8  0
 xys       txt      Mar.12 0
 xyb       txl      Mar.13 0
 xyb       txp      Mar.14 1

我希望能够比较该卡id的第一个记录和任何未来记录之间的日期,其中该未来记录的合法性为0,如果第一个记录在10天内,则显示该记录(注意:如果legit=0,则还需要包括第一条记录。
如果有更好的方法来考虑这个问题,我洗耳恭听。我很确定这里会用到dateddiff,但我不确定如何比较第一个记录和任何未来的记录。
输出示例如下:

card id | txn id | date | legit
xys       txs      Mar.8  0
xyb       txl     Mar.13  0
``` `WHERE legit = 0 ...` 
rekjcdws

rekjcdws1#

也许有更有效的方法,但我认为这能满足你的要求:

WITH x AS (
    SELECT *
    FROM (VALUES 
          ('xys','txq','2020-03-01'::DATE,1),
          ('xys','txs','2020-03-08'::DATE,0),
          ('xys','txt','2020-03-12'::DATE,0),
          ('xyb','txl','2020-03-13'::DATE,0),
          ('xyb','txp','2020-03-14'::DATE,1)) as y (card_id, txn_id, date_, legit)
    )
SELECT card_id,
    CASE WHEN legit = 0 THEN txn_id
         WHEN DATEDIFF('d',date_next,date_) <= 10 THEN txn_id_next
         ELSE txn_id END as txn_id,
    CASE WHEN legit = 0 THEN date_
         WHEN DATEDIFF('d',date_next,date_) <= 10 THEN date_next
         ELSE date_ END as date_,   
    CASE WHEN legit = 0 THEN legit
         WHEN DATEDIFF('d',date_next,date_) <= 10 THEN legit_next
         ELSE legit END as legit
FROM (
  SELECT *,
      ROW_NUMBER() OVER (PARTITION BY card_id ORDER BY date_) as row_num,
      LEAD(txn_id) OVER (PARTITION BY card_id ORDER BY date_) as txn_id_next,
      LEAD(date_) OVER (PARTITION BY card_id ORDER BY date_) as date_next,
      LEAD(legit) OVER (PARTITION BY card_id ORDER BY date_) as legit_next
  FROM x
  QUALIFY row_num = 1
  );

首先获取第一条记录和“下一条记录”,并将它们移动到一行,然后 CASE 语句根据我认为您指定的规则确定是使用第一条记录还是“下一条”记录。

vuv7lop3

vuv7lop32#

我希望能够比较该卡id的第一个记录和任何未来记录之间的日期,其中该未来记录的合法性为0,如果第一个记录在10天内,则显示该记录。
如果我理解正确,您可以使用窗口函数:

select t.*
from (select t.*, min(date) over (partition by cardid) as min_date
      from t
     ) t
where legit = 0 and date < min_date + interval '10 day';

相关问题