查找属于同一标识符的记录,检查列中多次出现的值
Find records that belong to the same identifier, check for multiple occurences of value in column
我有一个 table 将客户 ID 链接到销售 ID。多个客户可以链接到同一个销售 ID,但是第一个客户应该是类型为 'M' 的主要客户。所有其他客户应键入其他 ('O')。
Cust_ID Sale_ID Cust_Type
1 123 'M'
2 123 'O'
3 124 'M'
4 125 'M'
5 125 'O'
6 125 'O'
有时链接到同一销售 ID 的多个客户将是主要 ('M') 客户 - 这是不正确的:
Cust_ID Sale_ID Cust_Type
1 123 'M'
2 123 'M'
3 123 'O'
我希望能够做的是 return 客户 ID、销售 ID 和客户类型的列表,其中销售 ID 中的不止一个客户是主要客户。 IE。 Main ('M') 在具有相同销售 ID 的行中出现不止一次。
非常感谢任何帮助!
你是这个意思吗?这可以使用 window 函数来实现。
CREATE TABLE temp(
Cust_ID INT,
Sale_ID INT,
Cust_Type VARCHAR(1)
)
INSERT INTO temp VALUES
(1, 123, 'M'),
(2, 123, 'M'),
(3, 124, 'M'),
(4, 125, 'M'),
(5, 125, 'O'),
(6, 125, 'O');
WITH CTE AS(
SELECT *, cc = COUNT(*) OVER(PARTITION BY Sale_ID)
FROM temp
WHERE Cust_Type = 'M'
)
SELECT
Cust_ID,
Sale_ID,
Cust_Type
FROM CTE
WHERE cc > 1
DROP TABLE temp
这个怎么样:
SELECT s.Cust_ID, s.Sale_ID, s.Cust_Type
FROM Whosebug s INNER JOIN
(SELECT Sale_ID
FROM Whosebug
WHERE Cust_Type = 'M'
GROUP BY Sale_ID
HAVING COUNT(*) > 1) as Multiples ON s.Sale_ID = Multiples.Sale_ID
所以,问题是 sales_id
可以有多个 M
值,而您想检测到这一点。我会通过使用 window 函数来计算这些值来解决这个问题:
select t.*
from (select t.*,
sum(case when cust_type = 'M' then 1 else 0 end) over (partition by sales_id) as NumMs
from table t
) t
where NumMs > 1;
其实我会用条件NumMs <> 1
,因为错过主要客户可能也很重要。
我有一个 table 将客户 ID 链接到销售 ID。多个客户可以链接到同一个销售 ID,但是第一个客户应该是类型为 'M' 的主要客户。所有其他客户应键入其他 ('O')。
Cust_ID Sale_ID Cust_Type
1 123 'M'
2 123 'O'
3 124 'M'
4 125 'M'
5 125 'O'
6 125 'O'
有时链接到同一销售 ID 的多个客户将是主要 ('M') 客户 - 这是不正确的:
Cust_ID Sale_ID Cust_Type
1 123 'M'
2 123 'M'
3 123 'O'
我希望能够做的是 return 客户 ID、销售 ID 和客户类型的列表,其中销售 ID 中的不止一个客户是主要客户。 IE。 Main ('M') 在具有相同销售 ID 的行中出现不止一次。
非常感谢任何帮助!
你是这个意思吗?这可以使用 window 函数来实现。
CREATE TABLE temp(
Cust_ID INT,
Sale_ID INT,
Cust_Type VARCHAR(1)
)
INSERT INTO temp VALUES
(1, 123, 'M'),
(2, 123, 'M'),
(3, 124, 'M'),
(4, 125, 'M'),
(5, 125, 'O'),
(6, 125, 'O');
WITH CTE AS(
SELECT *, cc = COUNT(*) OVER(PARTITION BY Sale_ID)
FROM temp
WHERE Cust_Type = 'M'
)
SELECT
Cust_ID,
Sale_ID,
Cust_Type
FROM CTE
WHERE cc > 1
DROP TABLE temp
这个怎么样:
SELECT s.Cust_ID, s.Sale_ID, s.Cust_Type
FROM Whosebug s INNER JOIN
(SELECT Sale_ID
FROM Whosebug
WHERE Cust_Type = 'M'
GROUP BY Sale_ID
HAVING COUNT(*) > 1) as Multiples ON s.Sale_ID = Multiples.Sale_ID
所以,问题是 sales_id
可以有多个 M
值,而您想检测到这一点。我会通过使用 window 函数来计算这些值来解决这个问题:
select t.*
from (select t.*,
sum(case when cust_type = 'M' then 1 else 0 end) over (partition by sales_id) as NumMs
from table t
) t
where NumMs > 1;
其实我会用条件NumMs <> 1
,因为错过主要客户可能也很重要。