【问题标题】:Finding values with fewer repititions in SQLite在 SQLite 中查找重复次数较少的值
【发布时间】:2018-10-01 03:33:23
【问题描述】:

我有一个包含多个列的表,但我关心的两个我们可以称为 Alpha 和 Beta。还有第三个,Gamma,它是 Alpha 和 Beta 之间的比较。我们将简化它并说 Gamma 是 Alpha 和 Beta 之间的区别,所以我有这样的东西:

Alpha  Beta  Gamma
-----  ----  -----
1       A     (some answer)
1       B     (some answer)
1       C     (some answer)
2       A     (some answer)
2       B     (some answer)
2       C     (some answer)
3       A     (some answer)
3       B     (some answer)
3       C     (some answer)
4       A     (some answer)
4       B     (some answer)
4       C     (some answer)

此时Gamma的内容并不重要。

假设我最终在 Beta 版中获得了一个新值“D”。我有 1D 和 3D,但没有 2D 和 4D。

我可以在 Sqlite 中通过查询找到哪些 Alpha 值还没有对应的 D 值吗?例如,在此表中:

Alpha  Beta  Gamma
-----  ----  -----
1       A     (some answer)
1       B     (some answer)
1       C     (some answer)
1       D     (some answer)
2       A     (some answer)
2       B     (some answer)
2       C     (some answer)
3       A     (some answer)
3       B     (some answer)
3       C     (some answer)
3       D     (some answer)
4       A     (some answer)
4       B     (some answer)
4       C     (some answer)

由于我需要每个 Alpha 值都有对应的 Beta 值,这似乎是我需要做的:

  1. 获取不存在于 Alpha 中的每个值的值列表(换句话说,在这种情况下,这将只是 D。
  2. 获取 Alpha 中没有对应 D 值的每个值的列表。

最终,我需要填写表格,以便每个 Alpha 值都与 Beta 中的每个 dinstinct 值具有匹配的 Beta 值。

注意:第二张表之后的部分已更改,以提供我认为需要执行的具体步骤的列表。)

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    你能做到吗:

    1) 回答问题 (a):

    Select beta from test 
      GROUP BY beta
      having count(alpha) < (select count(distinct alpha) from test);
    

    2)问题(b):

    Select alpha from test 
      GROUP BY alpha
      having count(beta) < (select count(distinct beta) from test);
    

    尝试输入以下内容:

    Create table test (alpha int, beta varchar(2));
    
    insert into test values (1, "A");
    insert into test values (1, "B");
    insert into test values (1, "C");
    insert into test values (1, "D");
    insert into test values (2, "A");
    insert into test values (2, "B");
    insert into test values (2, "C");
    insert into test values (3, "A");
    insert into test values (3, "B");
    insert into test values (3, "C");
    insert into test values (3, "D");
    insert into test values (4, "A");                                           
    insert into test values (4, "B");                                           
    insert into test values (4, "C");
    

    【讨论】:

    • 谢谢 - 这让我意识到我的问题表述有误 - 因为我需要找出 Beta 中的哪些值不是用于 Alpha 中的每个值。
    • 看看这个,在第 2 行,你的意思是“Beta NOT IN (1,4)?”
    【解决方案2】:

    计算每个 Alpha 有多少个 Beta:

    SELECT Alpha, COUNT(*)
    FROM MyTable
    GROUP BY Alpha;
    

    然后取最大值,并检索所有较小的计数:

    WITH Counts(Alpha, Count) AS (
      SELECT Alpha, COUNT(*)
      FROM MyTable
      GROUP BY Alpha
    )
    SELECT Alpha
    FROM Counts
    WHERE Count < (SELECT MAX(Count)
                   FROM Counts);
    

    【讨论】:

    • 我也在考虑类似的思路,但也想知道这是否是一种“冗长”的方式。
    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2019-07-03
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多