问题描述
SELECT COUNT(disTINCT (fgt_curate.orders.ordernumber)) AS cnt,fgt_curate.d_datetable.Weeknum
FROM fgt_curate.orders
LEFT JOIN fgt_curate.d_datetable ON fgt_curate.d_datetable.Date_Key = fgt_curate.orders.Orderdatekey
WHERE YEAR> 2020
AND cancelled = FALSE
AND fgt_curate.d_datetable.Weeknum <= 11
GROUP BY fgt_curate.d_datetable.Weeknum
输出类似于下面的表格:
cnt | weeknum |
---|---|
15 | 1 |
18 | 2 |
23 | 3 |
12 | 4 |
谢谢你们。
解决方法
这将是:
SELECT d.Weeknum,COUNT(DISTINCT o.ordernumber) AS cnt,SUM(COUNT(DISTINCT o.ordernumber)) OVER (ORDER BY d.Weeknum) as running_cnt
FROM fgt_curate.orders o LEFT JOIN
fgt_curate.d_datetable d
ON d.Date_Key = o.Orderdatekey
WHERE d.YEAR > 2020 AND
o.cancelled = FALSE AND
d.Weeknum <= 11
GROUP BY d.Weeknum;
注意事项:
- 使用表别名使查询更易于编写和阅读。
- 限定所有列引用,以便来源清晰。我不得不猜测您查询中的大多数列。
-
WHERE
子句将LEFT JOIN
转换为内部联接。你应该改变它(但我上面没有这样做)。 -
DISTINCT
不是COUNT(DISTINCT)
中的函数。o.ordernumber
周围的括号是多余的。 - 我认为
ordernumber
在名为orders
的表中是唯一的。如果是这样,只需使用COUNT(*)
。
编辑:
我推测您希望获得指定时间段内的所有周。如果是这样,结构将是:
SELECT d.Weeknum,SUM(COUNT(DISTINCT o.ordernumber)) OVER (ORDER BY d.Weeknum) as running_cnt
FROM fgt_curate.d_datetable d LEFT JOIN
fgt_curate.orders o
ON o.Orderdatekey = d.Date_Key AND
o.cancelled = FALSE
WHERE d.YEAR > 2020 AND
d.Weeknum <= 11
GROUP BY d.Weeknum;
要保留所有行(日期)的表排在第一位。对该表的任何过滤都在 WHERE
子句中。对后续表的任何过滤都在 ON
子句中。