【问题标题】:Cumulative count distinct in NetezzaNetezza 中不同的累积计数
【发布时间】:2014-12-12 00:58:32
【问题描述】:

我正在使用 Netezza。我正在处理营销数据,特别是优惠券。现在我正在计算不同的每日优惠券兑换者;没什么大不了的。不过,我想知道迄今为止不同的救赎者的数量。请注意,这不仅仅是每日赎回者的总和,因为客户可能在不同的日子赎回,因此每日赎回者的总和可能是多次计算的客户。

我闭上眼睛,许了个愿,然后执行了以下查询,希望它能起作用:

select redemption_date
      ,count(distinct(customer_id)) as day_redeemers
      ,count(distinct(customer_id)) over (partition by null rows unbounded preceding) as cml_redeemers
from coupon_history
group by 1
order by 1

但 Netezza 抱怨说: 错误 [HY000] 错误:属性 CUSTOMER_ID 必须在聚合函数中进行分组或使用

...于是我闭上眼睛,许下愿望,然后执行以下操作(注意添加到 group by):

select redemption_date
      ,count(distinct(customer_id)) as day_redeemers
      ,count(distinct(customer_id)) over (partition by null rows unbounded preceding) as cml_redeemers
from coupon_history
group by 1,customer_id
order by 1

Netezza 抱怨如下:

ERROR [HY000] ERROR:  DISTINCT aggregate not allowed in window with ORDER BY or frame specification

该错误使我认为 Netezza 在内部订购 customer_id 是为了计算转换并因此区分。但这确实让我对接下来应该尝试的事情感到不知所措。我希望有一些简单的东西,但显然这不是我的幸运日。

关于如何使我的原始查询工作的任何想法,或对替代方法的建议?

谢谢!

【问题讨论】:

    标签: sql distinct netezza windowing


    【解决方案1】:

    您总是可以诉诸蛮力——即使用相关子查询:

    select redemption_date,
           count(distinct(customer_id)) as day_redeemers,
           (select count(distinct ch2.customer_id)
            from coupon_history ch2
            where ch2.redemption_date <= ch.redemption_date
           ) as cml_redeemers
    from coupon_history ch
    group by 1
    order by 1;
    

    当然,性能不会那么好。

    编辑:

    解决此问题的另一种方法是获取每个客户的第一个兑换日期,然后只使用累积金额:

    select minrd,
           sum(count(*)) over (order by minrd) as cml_redeemers
    from (select ch.customer_id, min(redemption_date) as minrd
          from coupon_history ch
          group by ch.customer_id
         ) ch
    group by minrd;
    

    【讨论】:

    • 第二种方法必须聪明,因为我很难理解它。但看起来您将客户的第一次兑换日期视为该客户的 ID……并且由于他们只能有一个分钟日期,因此我们不会在随后的几天内重复。 我确实认为你的意思是 sum(count(*)) over (order by minrd) ...否则你基本上只会得到行号。
    • @Chris。 . .您对第二种方法有完全正确的想法。而且,是的,应该是sum(count(*))(现在已修复)。
    • 酷。这很好用!至于第一种方法,我总是忘记相关子查询(尤其是作为单个选定值)......我认为这是一种潜意识的防御机制。尽管如此,我还是尝试了一下,显然 Netezza 不想参与其中。它抱怨说,“不支持这种形式的相关查询 - 考虑重写”。无论如何,谢谢!
    • @Chris。 . .奇怪的是 Netezza 不支持第一个版本。它是标准 SQL Postgres 支持的语法。我很惊讶。
    • 嗯...也许我把它弄坏了。我上面的查询被简化以删除一些地方。查询不会很好地粘贴在这个小盒子里,但如果你想看一下,我在 http://www.wepaste.com/hammondegger/ 有它(我在里面放了两个空格,这样 SO 就不会中断我的链接)。
    猜你喜欢
    • 1970-01-01
    • 2014-07-26
    • 2018-12-04
    • 1970-01-01
    • 2017-03-23
    • 2020-10-08
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    相关资源
    最近更新 更多