【问题标题】:Count Unique Identifiers by a result in another column按另一列中的结果计算唯一标识符
【发布时间】:2019-02-01 14:28:38
【问题描述】:

我试图在 SQL 中返回一些值。让我们将Column A 称为UniqueIdentifier 然后我有一行列出了可以对这个唯一标识符执行的两个不同操作,我们将列称为action 和操作ab

每个唯一标识符的操作可以重复多次,因此会列出大量重复的UniqueIdentifier

如何获取已执行操作 aUniqueIdentifier 计数和未执行操作 a 的计数?

我确实使用临时表创建了一个非常冗长且繁琐的方式(如下所列),但我觉得必须有一个更迂回的方式

<!-- language: lang-sql -->
select
UniqueIdentifier
,case when action = 'a' then 1 else 0 end [actionflag]
into #actionflags
from mydatabase


select
distinct UniqueIdentifier
,sum(actionflag)
into #actionflagscount
from #actionflags
group by UniqueIdentifier


select case when actionflag > 0 then 1 else 0 end [actionflag]
,count(uniqueidentifier)
from #actionflagscount
group by case when actionflag > 0 then 1 else 0 end

【问题讨论】:

  • 你能发布表格的 (database?) 定义吗?它并不觉得UniqueIdentifier 在这里是独一无二的,但也许(UniqueIdentifier, action) 会是。另外,你能指定你正在使用的 DBMS 吗?
  • 唯一标识符是唯一的,但它会重复,因为该操作可以对其执行多次,即 IE,对一个唯一标识符执行 30 种不同的操作我正在使用 SQL Server 2014 我想
  • 这基本上就是我所说的不是独特的。请,我真的需要信息,发布表格的定义
  • 您可以将我的表视为一种活动日志,其中唯一标识符可以在不同时间多次执行该操作,然后将其记录下来。
  • 您将来需要做的是在您的问题中发布create table。对于这里的许多贡献者来说,准确了解应用于表的约束至关重要,即使它只是您正在构建的测试用例,而不是您对约束的潜在错误理解。无论如何,我已经尝试根据我的理解自己给出答案,看看它是否涵盖了你想要得到的。

标签: sql sql-server


【解决方案1】:

你想要DISTINCT 吗?

select case when actionflag > 0 then 1 else 0 end [actionflag],
       count(distinct uniqueidentifier)
from #actionflagscount
group by case when actionflag > 0 then 1 else 0 end

【讨论】:

    【解决方案2】:

    这是我想出来的

    DROP TABLE IF EXISTS #temp
    
    CREATE TABLE #temp ([UniqueIdentifier] INT, Action NVARCHAR(10))
    
    INSERT INTO #temp ([UniqueIdentifier], Action) VALUES (1, 'a')
    INSERT INTO #temp ([UniqueIdentifier], Action) VALUES (2, 'a')
    INSERT INTO #temp ([UniqueIdentifier], Action) VALUES (3, 'a')
    INSERT INTO #temp ([UniqueIdentifier], Action) VALUES (4, 'b')
    INSERT INTO #temp ([UniqueIdentifier], Action) VALUES (5, 'b')
    INSERT INTO #temp ([UniqueIdentifier], Action) VALUES (6, 'c')
    INSERT INTO #temp ([UniqueIdentifier], Action) VALUES (7, 'c')
    
    SELECT CASE WHEN Action = 'a' THEN 1 ELSE 0 END AS ActionFlag, COUNT(*)
    FROM #temp
    GROUP BY CASE WHEN Action = 'a' THEN 1 ELSE 0 END
    
    -- Results:
    -- ActionFlag   (No column name)
    -- 0    4
    -- 1    3
    

    【讨论】:

    • 我将数字 6 更改为 1 以更能代表我的困惑,因为这个表基本上是一个活动日志,我只想记录有多少 ui 有一个,有多少没有。当我将你 6 更改为 1 并将相应的 c 更改为 a 时,我得到 1 个动作标志中的 4 个
    【解决方案3】:

    考虑到您可能有:

    • 同一个action在同一个UniqueIdentifier上执行了多次
    • 不同的actions 对同一个UniqueIdentifier 执行

    我愿意:

    SELECT DISTINCT UniqueIdentifier, CASE WHEN EXISTS (SELECT 1 FROM MyDatabase WHERE action = 'a' and UniqueIdentifier = MDB.UniqueIdentifier) THEN 1 ELSE 0 END AS ActionPerformed
    FROM MyDatabase MDB
    

    如果这看起来不错,那么,一个简单的COUNT 就可以解决上一个查询的问题。

    SELECT Count(*), ActionPerformed
    FROM (
        SELECT DISTINCT UniqueIdentifier, CASE WHEN EXISTS (SELECT 1 FROM MyDatabase WHERE action = 'a' and UniqueIdentifier = MDB.UniqueIdentifier) THEN 1 ELSE 0 END AS ActionPerformed
        FROM MyDatabase MDB
    ) T
    GROUP BY ActionPerformed
    

    ActionPerformed = 1 表示action a 已执行(可能action b 也在同一个UniqueIdentifier 上执行)。 ActionPerformed = 0 表示 action a 没有执行(但它没有说明 action b 的任何内容)

    【讨论】:

      【解决方案4】:

      我会使用两个级别的聚合:

      select sum(case when num_as > 0 then 1 else 0 end) as num_with_as,
             sum(case when num_as = 0 then 1 else 0 end) as num_without_as
      from (select uniqueidentifier,
                   sum(case when action = 'a' then 1 else 0 end) as num_as
            from mydatabase
            group by uniqueidentifier
           ) d;
      

      内部查询计算每个uniqueidentifier 的“a”数。外部查询使用它来获取您想要的两个值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-09
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多