sql - SQL 重复优化
问题描述
我有以下查询:
原始查询:
SELECT
cd1.cust_number_id, cd1.cust_number_id, cd1.First_Name, cd1.Last_Name
FROM @Customer_Data cd1
inner join @Customer_Data cd2 on
cd1.Cd_Id <> cd2.Cd_Id
and cd2.cust_number_id <> cd1.cust_number_id
and cd2.First_Name = cd1.First_Name
and cd2.Last_Name = cd1.Last_Name
inner join @Customer c1 on c1.Cust_id = cd1.cust_number_id
inner join @Customer c2 on c2.cust_id = cd2.cust_number_id
WHERE c1.cust_number <> c2.cust_number
我优化如下,但是我的优化有错误,找不到:
优化查询:
SELECT cd1.cust_number_id, cd1.cust_number_id, cd1.First_Name,cd1.Last_Name
FROM (
SELECT cdResult.cust_number_id, cdResult.First_Name,cdResult.Last_Name, COUNT(*) OVER (PARTITION BY cdResult.First_Name, cdResult.Last_Name) as cnt_name_bday
FROM @Customer_Data cdResult
WHERE cdResult.First_Name IS NOT NULL
AND cdResult.Last_Name IS NOT NULL) AS cd1
WHERE cd1.cnt_name_bday > 1;
测试数据:
DECLARE @Customer_Data TABLE
(
Cd_Id INT,
cust_number_id INT,
First_Name NVARCHAR(30),
Last_Name NVARCHAR(30)
)
INSERT @Customer_Data (Cd_Id,cust_number_id,First_Name,Last_Name)
VALUES (1, 22, N'Alex', N'Bor'),
(2, 22, N'Alex', N'Bor'),
(3, 23, N'Alex', N'Bor'),
(4, 24, N'Tom', N'Cruse'),
(5, 25, N'Tom', N'Cruse')
DECLARE @Customer TABLE
(
Cust_id INT,
Cust_number INT
)
INSERT @Customer (Cust_id, Cust_number)
VALUES (22, 022),
(23, 023),
(24, 024),
(25, 025)
问题是原始查询返回 6 行(复制行)。而优化返回只是重复,如何使优化查询也重复行?
解决方案
我建议只使用窗口函数:
SELECT CD.cud_customer_id
FROM (SELECT cd.*, COUNT(*) OVER (PARTITION BY cud_name, cud_birthday) as cnt_name_bday FROM dbo.customer_data cd
) cd
WHERE cnt_name_bday > 1;
您的查询正在查找名称或生日的重复项。您希望同时与两者重复。
推荐阅读
- android - 如何通过可访问性(类名)获取 url 浏览器
- excel - 单击组合框时用户窗体消失
- autodesk-forge - 是否可以仅使用父 dbid 部分加载巨大的模型?
- android - 无法在 UseEffect React Native 上使用导航用于启动画面
- netsuite - 如何获取记录列表,然后在相应记录旁边添加一个复选框,以便在 suiteScript 中编辑和保存更改
- html - 隐藏所有 #id 不在给定数组中的元素
- flutter - java.lang.ClassNotFoundException:颤振安装
- angular - 如果消息太长,如何处理 IF ELSE
- celery - 在大使/特使反向代理后面运行 Celery Flower
- python - python how to abstract the class of member variable