【问题标题】:SQL: count number of times a 'churn' occurs in a tableSQL:计算表中出现“流失”的次数
【发布时间】:2021-05-21 21:39:36
【问题描述】:

我有以下 SQLite DB 表app_vendor

app | vendor | active
---------------------
123 |   10   | 1  
123 |   20   | 0   // + 1 (10 is 1, 20 is 0)

255 |   10   | 1
255 |   20   | 0   // + 1 (10 is 1, 20 is 0)

675 |   10   | 0
675 |   20   | 0   // 0   (10 is 0, 20 is 0)

我想运行一个查询,比较所有出现的同一个应用

  • 如果供应商 10 处于活动状态:1 而供应商 20 不是:0

  • 返回在整个数据库表中发生的次数

在上面的示例中,它发生了两次(对于应用程序 123 和应用程序 255),因此返回值应该是 2。例如,我是 SQL 新手,不知道如何按“应用程序”进行分组。

【问题讨论】:

    标签: sql sqlite group-by count


    【解决方案1】:

    如果对于所有apps,供应商 10 有 1 行(顶部),供应商 20 有 1 行(顶部),那么:

    SELECT DISTINCT COUNT(*) OVER() counter
    FROM app_vendor
    WHERE vendor IN (10, 20) 
    GROUP BY app
    HAVING MIN(CASE WHEN vendor = 10 THEN active END) = 1
       AND MAX(CASE WHEN vendor = 20 THEN active END) = 0 
    

    使用INTERSECT 的另一种方法:

    SELECT COUNT(*) counter
    FROM (
      SELECT app FROM app_vendor WHERE vendor = 10 AND active = 1
      INTERSECT
      SELECT app FROM app_vendor WHERE vendor = 20 AND active = 0
    ) 
    

    请参阅demo
    结果:

    counter
    2

    【讨论】:

    • 我只是想检查一下我与您所说的第二个查询是否在同一页面上:在某些具有相同“app_id”的行中,某些“供应商”不存在。可能存在与“供应商”10 或 20 或两者都没有关系的“应用程序”。同一个应用程序还有其他供应商,例如30, 40, 50。您的第二个查询是否仍然有效与此进一步的信息?
    • @uber 再次阅读问题,我看到您希望供应商 10 处于活动状态 = 1,供应商 20 严格处于活动状态 0,反之亦然。如果某个应用只有 10 个供应商且 active = 1,您希望该应用出现在结果中吗?
    • 没有。我希望它专门与供应商 20 进行比较。好问题!
    • @uber 也有这样的情况,对于一个应用,供应商出现两次或更多?
    • 对于同一个应用程序,SAME 供应商不会出现多次。它只有一次,并且是 1 或 0 表示活动。例如:app 123, vendor 10, active 1。此行将不再显示为 active 的不同值
    【解决方案2】:
    select count(1)
      from (select * from test where vendor = 10 and active = 1) t1
      join (select * from test where vendor = 20 and active = 0) t2
        on t1.app = t2.app;
    

    【讨论】:

    • t1 和 t2 是什么,我应该像在您的示例中一样使用它吗?
    • @uber t1 和 t2 只是每个 subwueries 的别名(同义词)。您可以按原样使用它们。您只需将“测试”表名替换为您的表
    【解决方案3】:

    一种方法是使用条件聚合

    select count(*) 
    from (select app
         from t
         group by app
         having max(case when vendor=10 and active=1 then 1 end) 
                + max(case when vendor=20 and active=0 then 1 end) = 2) t2
    

    【讨论】:

    • 什么是't'和't2'?
    • @uber t 是您的表名,t2 是派生表(子查询)的别名
    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多