【问题标题】:Filter out the result after count() function过滤count()函数后的结果
【发布时间】:2022-01-04 12:06:28
【问题描述】:

在该列上使用 count() 函数后如何过滤掉结果? 例如我正在计算 ID,我想过滤掉只计算一次的 ID。

提前谢谢你:)

【问题讨论】:

  • 请提供数据结构、您已经尝试过的SQL以及结果存在的问题。您是否尝试过使用 HAVING 子句:docs.snowflake.com/en/sql-reference/constructs/having.html
  • @AlexandreJuma 对不起,我的意思是我想让他们不过滤掉他们 :) 我的查询如下所示: SELECT count(Customer_ID) FROM orders -- 我停在这里,我无法达到我的目标仅获取在 ORDERS 表中仅出现一次的 ID :)
  • 请用这些详细信息编辑您的问题...它们不应该出现在 cmets 中。关于 HAVING 语句,它应该允许您想要的逻辑。示例:SELECT a.id, COUNT(*) as CNT FROM docs a GROUP BY a.id HAVING COUNT(*) <> 1
  • 您需要提供样本数据和所需的输出

标签: database snowflake-cloud-data-platform data-analysis snowflake-schema


【解决方案1】:

要获得对Id 列应用过滤器的整行,您可以使用QUALIFY:

SELECT *, COUNT(*) OVER(PARTITION BY Id) AS cnt
FROM tab
QUALIFY cnt > 1;

【讨论】:

    【解决方案2】:

    我更喜欢这个而不是使用窗口函数:

    SELECT id, COUNT(*) as cnt
    FROM tab
    GROUP BY id
    HAVING cnt > 1;
    

    【讨论】:

      【解决方案3】:

      因此,Lukasz 和 Mike 的答案都是获得多次出现的 ID 的两种方法,而 Lukasz 是获得其他列的方法(并避免疯狂的大 GROUP BY 子句)。尽管在上下文中他的答案存在问题,但在这种模式下,ID 出现 5 次的行将有 5 行。

      但是考虑到你注意到的 cmets(应该已经编辑到问题中):

      我有:

      SELECT count(Customer_ID) FROM orders
      

      我停在这里,我无法达到我的目标,即只获取在 ORDERS 表中只出现一次的 ID

      如果我们忽略 SQL,因为它似乎走错了路。但是要获得客户唯一的订单ORDER's,可以这样做:

      SELECT
          o.detail_a,
          o.detail_b,
          o.customer_id
      FROM order AS o
      QUALIFY COUNT(*) OVER(PARTITION BY customer_id) = 1;
      

      或者,如果您只想要他们只有一个订单的 customer_id,例如,您可以稍后在 JOIN 中使用(因此是插入 CTE 的类型)

      SELECT 
          customer_id,
          COUNT(*) as cnt
      FROM ordered
      GROUP BY 1
      HAVING cnt = 1;
      

      【讨论】:

        猜你喜欢
        • 2017-12-15
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        • 1970-01-01
        • 1970-01-01
        • 2013-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多