Sql Netezza中不同的累积计数

Sql Netezza中不同的累积计数,sql,distinct,netezza,windowing,Sql,Distinct,Netezza,Windowing,我在用Netezza。我在处理营销数据,特别是优惠券。现在我正在统计不同的每日优惠券兑换者;没什么大不了的。不过,我想知道迄今为止不同的赎回人的数量。请注意,这不仅仅是每日赎回人的总和,因为客户可能会在不同的日期赎回,因此每日赎回人的总和可能是多次计算的客户 我闭上眼睛,许了个愿,然后执行了以下查询,希望它能起作用: select redemption_date ,count(distinct(customer_id)) as day_redeemers ,count(d

我在用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
但内特扎抱怨说: 错误[HY000]错误:属性CUSTOMER_ID必须分组或在聚合函数中使用

…因此,我闭上眼睛,许个愿,然后执行以下操作(请注意添加到组中的):

Netezza投诉如下:

ERROR [HY000] ERROR:  DISTINCT aggregate not allowed in window with ORDER BY or frame specification
这个错误让我认为Netezza在内部订购customer_id是为了计算转换和差异。但这确实让我有点不知所措,不知下一步该做什么。我本来希望得到一些简单的东西,但显然今天不是我的幸运日

有没有关于如何使我的原始查询工作的想法,或者关于替代方法的建议


谢谢

您总是可以诉诸暴力——也就是说,使用相关子查询:

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;

第二种方法一定很聪明,因为我很难理解它。但看起来你把客户的首次赎回日期当作是该客户的身份证。。。因为他们只能有一个最小日期,所以我们不会在以后的日子里重复。我认为你的意思是和(计数(*)超过(按明德顺序)。。。否则你基本上只能得到行号。@Chris。你对第二种方法的想法完全正确。是的,这应该是
sum(count(*)
(它现在是固定的)。酷。那很好!至于第一种方法,我总是忘记相关子查询(尤其是作为单个选定值)。。。我认为这是一种潜意识的防御机制。不过,我试过了,显然内特扎不想参与其中。它抱怨说,“这种形式的相关查询不支持——考虑重写”。无论如何,谢谢@克里斯。奇怪的是Netezza不支持第一个版本。它是标准SQL,Postgres支持这种语法。我很惊讶。嗯。。。也许是我弄坏了。我上面的查询被简化,以删除一些where。这个查询不会很好地粘贴在这个小框中,但是如果您想看一看,我可以在http://www.wepaste.com/hammondegger/上找到它(我在其中放了两个空格,这样就不会破坏我的链接)。
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;