我正在为 DataLemur SQL 问题编写一个解决方案,我几乎猜对了,但缺少一行。
我自己写了这个查询:
WITH CTE AS
(
SELECT
user_id,
transaction_date,
DENSE_RANK() OVER (PARTITION BY user_id order by transaction_date) as ranked_transact
FROM user_transactions
)
SELECT
transaction_date,
user_id,
COUNT(user_id) as purchase_count
FROM CTE
WHERE ranked_transact IN (SELECT MAX(ranked_transact) FROM CTE)
GROUP BY user_id, transaction_date
然后,当我提交时,我发现我缺少一行:由于某种原因,WHERE 子句条件不适用于 user_id = 115。
期望的结果应该是:
交易日期 | 用户ID | 购买次数 |
---|---|---|
2022年7月11日10:00:00 | 123 | 1 |
2022年7月12日10:00:00 | 115 | 1 |
2022年7月12日10:00:00 | 159 | 2 |
但是我的查询返回了:
交易日期 | 用户ID | 购买次数 |
---|---|---|
2022年7月11日10:00:00 | 123 | 1 |
2022年7月12日10:00:00 | 159 | 2 |
我检查了解决方案,发现他们按照 transaction_date 的降序排列排名,然后他们使用 WHERE transaction_date=1 。在我的查询中,我按升序对排名进行排序,并要求 select 语句返回最大排名值,该值应该为我提供最新的交易行,不是吗?
我可能错过了一些愚蠢的东西,但有人可以向我解释问题出在哪里以及为什么当我使用 count 函数时 user_id 115 不包括在内?
谢谢!
MAX(ranked_transact)
取决于 user_id
,因此您应该将其添加到 WHERE 子句中。
CREATE TABLE user_transactions (
product_id INTEGER ,
user_id INTEGER ,
spend DECIMAL(8,2) ,
transaction_date TIMESTAMP );
INSERT INTO user_transactions VALUES
('3673','123','68.90','07/08/2022 10:00:00'),
('9623','123','274.10','07/08/2022 10:00:00'),
('1467','115','19.90','07/08/2022 10:00:00'),
('2513','159','25.00','07/08/2022 10:00:00'),
('1452','159','74.50','07/10/2022 10:00:00'),
('1452','123','74.50','07/10/2022 10:00:00'),
('9765','123','100.15','07/11/2022 10:00:00'),
('6536','115','57.00','07/12/2022 10:00:00'),
('7384','159','15.50','07/12/2022 10:00:00'),
('1247','159','23.40','07/12/2022 10:00:00');
WITH CTE AS
(
SELECT
user_id,
transaction_date,
DENSE_RANK() OVER (PARTITION BY user_id order by transaction_date) as ranked_transact
FROM user_transactions
)
-- select * from CTE;
SELECT
transaction_date,
user_id,
COUNT(user_id) as purchase_count
FROM CTE
WHERE (user_id,ranked_transact) IN (SELECT user_id,MAX(ranked_transact) FROM CTE group by user_id)
GROUP BY user_id, transaction_date
;