我们的供应商最近迁移到 AWS 的 Redshift,它似乎不允许在 COUNT(DISTINCT()) 查询中使用多个条件。
我正在尝试统计用户一年内的所有访问量,但用户可能在一天内进行重复访问,我想避免计数。
使用此代码,我希望获得每年访问次数的表格,删除同一天的重复访问。
SELECT DATE_PART_YEAR(visit_date) as "year", COUNT(DISTINCT(userID, visit_date))
FROM visits
GROUP BY DATE_PART_YEAR(visit_date)
ORDER BY year;
预期结果:
年 | 数 |
---|---|
2018 | 12,703 |
2019 | 14,058 |
2020 | 15,920 |
2021 | 25,024 |
2022 | 39,739 |
这段代码适用于以前的数据库,但现在抛出一个我无法解决的错误:
ERROR: could not identify an equality operator for type record [ErrorId: 1-64c01a9a-51cd1ea7119c39603889c9c4]
我已经确认,当查询只有 COUNT(DISTINCT(userID)) 时,查询运行良好,但是一旦我将其更改为 COUNT(DISTINCT(userID, Visit_date)),它就会抛出上述错误。
我无法在线破译该错误,因为它在旧服务器(AWS 的 Athena)上运行良好,我假设它特定于 Redshift(它也需要 DATE_PART_YEAR(),而不仅仅是 YEAR())。
有没有一种方法可以解决在 COUNT(DISTINCT()) 中使用多个条件的问题,以便我可以统计用户访问的所有天数?
为此目的创建一个子查询怎么样?
SELECT "year", userID, count(*) as count
from (
SELECT v.DATE_PART_YEAR(visit_date) as "year", v.userID, v.visit_date
FROM visits v
GROUP BY DATE_PART_YEAR(visit_date), userID, visit_date
) t
GROUP BY "year", userID
ORDER BY year, userID;