【问题标题】:Netezza not supporting sub query and similar... any workaround?Netezza 不支持子查询和类似的...任何解决方法?
【发布时间】:2014-07-24 20:43:27
【问题描述】:

我相信这对你们大多数人来说是一个非常简单的问题,但它让我发疯了...... 我有一张这样的表(简化):

| customer_id | date | purchase amount |

我需要为每一天提取当天购买的客户数量,以及在当前交易之前的 30 天内至少进行购买的客户数量。

我尝试使用这样的子查询:

select purch_date as date, count (distinct customer_id) as DAU, 
   count(distinct (select customer_id from table where purch_date<= date and purch_date>date-30)) as MAU
from table
group by purch_date

Netezza 返回一个错误,指出不支持子查询,我应该考虑重写查询。但是怎么办?!?!? 我尝试使用case when 语句,但没有奏效。其实如下:

select purch_date as date, count (distinct customer_id) as DAU, 
   count(distinct case when (purch_date<= date and purch_date>date-30) then player_id else null end) as MAU
from table
group by purch_date

没有返回错误,但是 MAU 和 DAU 列是相同的(这是错误的)。 有人可以帮我吗?非常感谢

【问题讨论】:

  • Netezza 不喜欢选择行中的子选择...您最好编写两个查询,一个计算并返回 mau,另一个执行 dau(按日期)。将这两个查询转换为子查询,并在日期将它们连接在一起并从中进行选择。
  • 谢谢。但是如果我想根据日期加入他们,我需要按日期对 MAU 表进行分组,对吗?如果是这样,那么我有和以前一样的问题......你介意编写你所指的代码吗?非常感谢
  • 我认为无法在选择行中支持子查询来自用于分配查询处理器负载的神秘 netezza FPGA 逻辑。我发布了一个答案......有点猜测。您想要的是两个工作查询...一个用于计算给定日期的 DAU,另一个用于计算同一日期的 MAU。按日期对它们进行分组,在 from 子句中将它们称为子查询并在日期加入它们

标签: sql subquery netezza


【解决方案1】:

我不相信 netezza 支持选择行中的子查询...移至 from 语句

 select pur_date as date, count(distinct customer_id) as DAU
 from table
 group by purch_date

 select pur_date as date, count (distinct customer_ID) as MAU
 from table
 where purch_date<= date and purch_date>date-30
 group by purch_date

我希望这适用于 MAU 和 DAU。加入他们以获得合并的结果:

 select a.date, a.dau, b.mau
 from
 (select pur_date as date, count(distinct customer_id) as DAU
 from table
 group by purch_date) a

 left join 
 (select pur_date as date, count (distinct customer_ID) as MAU
 from table
 where purch_date<= date and purch_date>date-30
 group by purch_date) b

 on b.date = a.date

【讨论】:

  • 但是在这种情况下,您不会计算 MAU,因为第二个查询的 count(distinct customer_ID) 仍然会每天拆分计数,因为您是按 purch_date 分组的。我错了吗?感谢回复
  • 你是对的......我们希望它返回 30 天时间范围内的第一天,而不是 pur_date。这将是一个小技巧......给我一点
【解决方案2】:

我终于明白了 :) 对于所有感兴趣的人,这是我解决它的方法:

select a.date_dt, max(a.dau), count(distinct b.player_id)
from (select dt.cal_day_dt as date_dt, 
        count(distinct s.player_id) as dau
        FROM IA_PLAYER_SALES_HOURLY s
        join IA_DATES dt on dt.date_key = s.date_key
        group by dt.cal_day_dt
        order by dt.cal_day_dt
) a
join (
        select dt.cal_day_dt as date_dt, 
        s.player_id as player_id
        FROM IA_PLAYER_SALES_HOURLY s
        join IA_DATES dt on dt.date_key = s.date_key
        order by dt.cal_day_dt
) b on b.date_dt <= a.date_dt and b.date_dt > a.date_dt - 30
group by a.date_dt
order by a.date_dt;

希望这有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2021-10-31
    • 2011-09-16
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多