【问题标题】:Select records from a result从结果中选择记录
【发布时间】:2021-02-17 09:46:58
【问题描述】:

我有以下数据作为查询的结果

agr_no cld_type_cd from_dt untl_dt hour_qt
00000080064 3 2020-01-01 2020-01-01 5.00
00000080064 3 2021-02-17 2021-02-17 1.00
00000080064 4 2021-02-17 2021-02-17 NULL
00000080064 4 2021-02-17 2021-02-17 2.00
00000080064 4 2021-02-17 2021-02-17 1.00

我需要的输出如下:

agr_no cld_type_cd from_dt untl_dt hour_qt
00000080064 3 2020-01-01 2020-01-01 5.00
00000080064 4 2021-02-17 2021-02-17 NULL
00000080064 4 2021-02-17 2021-02-17 2.00
00000080064 4 2021-02-17 2021-02-17 1.00

逻辑是:当在同一个from_dt和untl_dt上存在一条cld_type_cd = 4且hour_qt为NULL的记录时,则不需要在同一个from dt和untl dt上cld type cd = 3的记录。

如果可能,我正在寻找一种简单的解决方案(1 个查询),而不是使用临时或公用表表达式。有可能吗?

【问题讨论】:

  • 您使用的是哪种 DBMS 产品? “SQL”只是所有关系数据库都使用的一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS

标签: sql sql-server select


【解决方案1】:
WITH CTE(AGR_NO,CLD_TYPE_CD,FROM_DT,UNTL_DT,HOUR_QT) AS
(
   SELECT '00000080064' ,   3,  '2020-01-01' ,  '2020-01-01',   5.00
       UNION ALL
   SELECT '00000080064' ,   3 , '2021-02-17' ,  '2021-02-17' ,  1.00
       UNION ALL
   SELECT '00000080064' ,   4,  '2021-02-17' ,  '2021-02-17' ,  NULL
       UNION ALL
   SELECT '00000080064',    4,  '2021-02-17' ,  '2021-02-17' ,  2.00
      UNION ALL
   SELECT '00000080064',    4,  '2021-02-17',   '2021-02-17' ,  1.00
)

SELECT C.AGR_NO,C.CLD_TYPE_CD,C.FROM_DT,C.UNTL_DT,C.HOUR_QT
 FROM CTE AS C
 WHERE NOT EXISTS
 (
   SELECT 1 FROM CTE AS C2 WHERE C.AGR_NO=C2.AGR_NO AND C2.CLD_TYPE_CD=4 AND   C.CLD_TYPE_CD=3
    AND C.FROM_DT=C2.FROM_DT AND C.UNTL_DT=C2.UNTL_DT AND C2.HOUR_QT IS NULL

)

根据您的数据样本,如果适合您,请尝试上述查询

【讨论】:

    【解决方案2】:

    您可以使用窗口函数来做到这一点:

    select t.*
    from (select t.*,
                 sum(case when cld_type_cd = 4 then 1 else 0 end) over (partition by agr_no, from_dt, untl_dt) as num_4s
          from t
         ) t
    where not (cld_type_cd = 3 and num_4s > 0);
    

    这个版本的优点是它只引用了一次t。因此,如果这是一个复杂的查询、CTE、视图或函数,那么这应该比多次引用它的解决方案更快。

    Here 是一个 dbfiddle。

    【讨论】:

      猜你喜欢
      • 2021-02-14
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多