gpt4 book ai didi

sql-server - SQL 查询,例如带有 OR 条件的 GROUP BY

转载 作者:行者123 更新时间:2023-12-02 11:40:27 25 4
gpt4 key购买 nike

我会尝试描述真实情况。在我们公司,我们有一个带有 table 的预订系统,我们称之为客户,其中电子邮件和电话联系方式与每个传入订单一起保存 - 这是我无法更改的系统的一部分。我面临的问题是如何获取唯一客户的数量。对于独特客户,我指的是具有相同电子邮件或相同电话号码的一群人。

示例 1:从现实生活中,您可以想象汤姆和桑德拉结婚了。汤姆订购了 4 种产品,在我们的预订系统中填写了 3 个不同的电子邮件地址和 2 个不同的电话号码,其中一个与桑德拉共用(作为家庭电话),因此我可以假设它们以某种方式连接。桑德拉除了这个共享电话号码外,还填写了她的私有(private)电话号码,并且对于这两个订单,她只使用了一个电子邮件地址。对我来说,这意味着将以下所有行计为一个唯一客户。所以事实上这个独特的客户可能会成长为整个家庭。

ID   E-mail              Phone          Comment
---- ------------------- -------------- ------------------------------
0 tom@email.com +44 111 111 First row
1 tommy@email.com +44 111 111 Same phone, different e-mail
2 thomas@email.com +44 111 111 Same phone, different e-mail
3 thomas@email.com +44 222 222 Same e-mail, different phone
4 sandra@email.com +44 222 222 Same phone, different e-mail
5 sandra@email.com +44 333 333 Same e-mail, different phone

ypercube说我可能需要递归来计算所有这些独特客户

示例 2:这是我想要执行的示例。

是否可以在不使用例如通过使用光标或其他东西进行递归,或者递归是否必要?

ID   E-mail              Phone          Comment
---- ------------------- -------------- ------------------------------
0 linsey@email.com +44 111 111 ─┐
1 louise@email.com +44 111 111 ├─ 1. unique customer
2 louise@email.com +44 222 222 ─┘
---- ------------------- -------------- ------------------------------
3 steven@email.com +44 333 333 ─┐
4 steven@email.com +44 444 444 ├─ 2. unique customer
5 sandra@email.com +44 444 444 ─┘
---- ------------------- -------------- ------------------------------
6 george@email.com +44 555 555 ─── 3. unique customer
---- ------------------- -------------- ------------------------------
7 xavier@email.com +44 666 666 ─┐
8 xavier@email.com +44 777 777 ├─ 4. unique customer
9 xavier@email.com +44 888 888 ─┘
---- ------------------- -------------- ------------------------------
10 robert@email.com +44 999 999 ─┐
11 miriam@email.com +44 999 999 ├─ 5. unique customer
12 sherry@email.com +44 999 999 ─┘
---- ------------------- -------------- ------------------------------
----------------------------------------------------------------------
Result ∑ = 5 unique customers
----------------------------------------------------------------------

我尝试过使用 GROUP BY 进行查询,但我不知道如何按第一列或第二列对结果进行分组。我正在寻找类似的东西

SELECT COUNT(*) FROM Customers
GROUP BY Email OR Phone

再次感谢您的建议

P.S.在完全改写之前,我真的很感谢这个问题的答案。现在这里的答案可能与更新不对应,所以如果您打算这样做,请不要在这里投反对票(当然问题除外:)。我完全重写了这篇文章。

感谢并抱歉我的错误开始。

最佳答案

这是使用递归 CTE 的完整解决方案。

;WITH Nodes AS
(
SELECT DENSE_RANK() OVER (ORDER BY Part, PartRank) SetId
, [ID]
FROM
(
SELECT [ID], 1 Part, DENSE_RANK() OVER (ORDER BY [E-mail]) PartRank
FROM dbo.Customer
UNION ALL
SELECT [ID], 2, DENSE_RANK() OVER (ORDER BY Phone) PartRank
FROM dbo.Customer
) A
),
Links AS
(
SELECT DISTINCT A.Id, B.Id LinkedId
FROM Nodes A
JOIN Nodes B ON B.SetId = A.SetId AND B.Id < A.Id
),
Routes AS
(
SELECT DISTINCT Id, Id LinkedId
FROM dbo.Customer

UNION ALL

SELECT DISTINCT Id, LinkedId
FROM Links

UNION ALL

SELECT A.Id, B.LinkedId
FROM Links A
JOIN Routes B ON B.Id = A.LinkedId AND B.LinkedId < A.Id
),
TransitiveClosure AS
(
SELECT Id, Id LinkedId
FROM Links

UNION

SELECT LinkedId Id, LinkedId
FROM Links

UNION

SELECT Id, LinkedId
FROM Routes
),
UniqueCustomers AS
(
SELECT Id, MIN(LinkedId) UniqueCustomerId
FROM TransitiveClosure
GROUP BY Id
)
SELECT A.Id, A.[E-mail], A.Phone, B.UniqueCustomerId
FROM dbo.Customer A
JOIN UniqueCustomers B ON B.Id = A.Id

关于sql-server - SQL 查询,例如带有 OR 条件的 GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6280629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com