【问题标题】:Compare the values within the same column against other columns in SQL Server将同一列中的值与 SQL Server 中的其他列进行比较
【发布时间】:2021-02-22 21:03:57
【问题描述】:

我有一张如下表

id      ParentName    HandleName       CreatedDate       
===================================================
139       MI          MI-Chart-QL       2018-02-20       
139       MI          MI-chart-act      2018-02-20       
139       MI          MI-chart-act      2018-02-20       
139       CRA         CRA-chart-act     2018-02-20
139       CRA         CRA-Chart-act     2018-02-20

我想添加一个包含值的列 - 有意或无意 如果 Act 的 HandleName 与具有 QL 的 id、CreatedDate 和 ParentName 的 HandleName 具有相同的 id、CreatedDate 和 ParentName,那么它是故意的。我正在寻找的决赛桌是

id      ParentName    HandleName       CreatedDate    Intentionally/unintentionally   
====================================================================================
139       MI          MI-Chart-QL       2018-02-20       Intentionally
139       MI          MI-chart-act      2018-02-20       Intentionally
139       MI          MI-chart-act      2018-02-20       Intentionally
139       CRA         CRA-chart-act     2018-02-20       Unintentionally   
139       CRA         CRA-Chart-act     2018-02-20       Unintentionally 
  

带有“CRA-chart-act”的 HandleName 是无意的,因为 ParentName 与“MI-Chart-QL”不匹配

我使用了下面的代码(如果 Row_Number()>2 我可以故意标记它们)但是我如何检查它们的父名称是否相同以有意或无意地标记它们?

Row_Number() over (Partition by id, CreatedDate ORDER BY createdDate asc)

【问题讨论】:

  • 您在此处建议的逻辑意味着Handle-Name 包含一个分隔值,因为actql 具有附加含义。那是对的吗?如果是这样,他们真的应该有一个单独的列。
  • 不幸的是,表没有单独的列包含qlact,但逻辑基于包含qlact 的HandleName
  • 您始终可以在包含额外列的子查询或公用表表达式中创建新数据集,例如this

标签: sql sql-server count case window-functions


【解决方案1】:

这是另一种方式:

SELECT
    t1.*
    , CASE
          WHEN t2.Intentionally = 1 THEN 'Intentionally'
          ELSE 'Unintentionally'
      END AS 'Intentionally/unintentionally'
FROM
    mytable t1
    OUTER APPLY
    (
        SELECT TOP 1
            1 AS 'Intentionally'
        FROM
            mytable t2
        WHERE
            t1.parentName = t2.parentname
            AND t1.CreatedDate = t2.CreatedDate
            AND t2.HandleName LIKE '%QL'
    )       t2;

【讨论】:

    【解决方案2】:

    你可以使用窗口函数:

    select t.*,
        case when max(case when handlename like '%-QL%' then 1 else 0 end)
                      over(partition by id, parentname, createddate) = 1
            then 'Intentionally'
            else 'Unintentionally'
        end as status
    from mytable t
    

    【讨论】:

    • 不错的解决方案,但不会有这个。 db<>fiddle 如果有人想要的话。
    • 这非常有帮助,谢谢!有没有一种方法可以避免只有两个没有 ActQL 被标记为预期,因为它具有相同的 ParentName、id 和 CreatedDate ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2020-07-30
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多