mysql - SQL Amazon BIE 面试题 客户表
问题描述
交易表
列类型 id 整数 user_id 整数 created_at 日期时间 product_id 整数 数量 整数
用户表
列类型 id 整数名称 varchar 性别 varchar
编写查询以识别在 2019 年和 2020 年分别进行超过三笔交易的客户。
输出
列类型 customer_name 字符串
我的代码是:</p>
WITH CTE AS( SELECT u.name, count(user_id) AS "Num_Apperence",YEAR(t.created_at)
FROM transactions t
LEFT JOIN users u
ON t.user_id = u.id
WHERE YEAR(t.created_at) = 2019
GROUP BY u.name
HAVING count(user_id) > 3
)
SELECT Name1
FROM (SELECT u.name AS 'Name1', count(user_id) AS "Num_Apperence",YEAR(t.created_at)
FROM transactions t
LEFT JOIN users u
ON t.user_id = u.id
WHERE YEAR(t.created_at) = 2020
GROUP BY u.name
HAVING count(user_id) > 3) AS T
INNER JOIN CTE
ON CTE.name = T.Name1
这是可运行的,但无法通过测试用例。我就纳闷了,怎么回事??
解决方案
一种方法是使用带有条件聚合的单个查询来查找在 2019 年和 2020 年进行超过三笔交易的用户:
WITH cte AS (
SELECT user_id
FROM transactions
GROUP BY user_id
HAVING COUNT(CASE WHEN YEAR(created_at) = 2019 THEN 1 END) > 3 AND
COUNT(CASE WHEN YEAR(created_at) = 2020 THEN 1 END) > 3
)
SELECT
u.id,
u.name
FROM users u
INNER JOIN cte t
ON t.user_id = u.id;
推荐阅读
- bash - 通过脚本更改密码
- c# - MongoDb C# Driver with Group and Project using Aggregate() 查询给出异常
- c# - 如何使用启用了多重身份验证的 Office 365 帐户中的 VB.NET 或 C# 代码发送电子邮件?
- node.js - What is the `PM2` for command `yarn run start`?
- xml - 使用 xslt 来自特定节点类型的 XML 到 csv
- angular - Angular6 & tinyMCE 编辑器
- if-statement - 带有检索和变量的 sparql 查询 if 语句
- php - 如何将图像名称保存在数据库中以便以后查看?
- excel - 删除 VBA 工作表中提到的多个变量列
- php - 在验证用户与 Symfony 4 和 FOSUserBundle 连接后重定向用户