对不起,我没有先约SQLFiddle评论理解。我在那里测试了代码,发现我需要修补更多东西。
查询需要将n *个列从最终的group-by表达式移到聚合,以及(在第一个FROM和第二个SELECT之间 - 和COUNT()> = 2而不是COUNT()> 2.
现在在您的测试代码上运行时,它可以工作。
下面是测试http://sqlfiddle.com/#!2/9e3cb/21/0
修正接听网址:
SELECT id, MAX(n1) n1, MAX(n2) n2, MAX(n3) n3, MAX(n4) n4, MAX(n5) n5,
MAX(n6) n6, MAX(n7) n7, MAX(n8) n8, MAX(n9) n9, MAX(n10) n10,
MAX(GrpSize) Max, COUNT(GrpNumber) Sets
FROM (
SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, GrpNumber, COUNT(*) GrpSize
FROM (
SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,
CASE Numbers.N
WHEN 1 THEN n1 - N
WHEN 2 THEN n2 - N
WHEN 3 THEN n3 - N
WHEN 4 THEN n4 - N
WHEN 5 THEN n5 - N
WHEN 6 THEN n6 - N
WHEN 7 THEN n7 - N
WHEN 8 THEN n8 - N
WHEN 9 THEN n9 - N
WHEN 10 THEN n10 - N
END GrpNumber
FROM `mytbl`
CROSS JOIN (
SELECT 1 AS N UNION ALL
SELECT 2 AS N UNION ALL
SELECT 3 AS N UNION ALL
SELECT 4 AS N UNION ALL
SELECT 5 AS N UNION ALL
SELECT 6 AS N UNION ALL
SELECT 7 AS N UNION ALL
SELECT 8 AS N UNION ALL
SELECT 9 AS N UNION ALL
SELECT 10 AS N
) Numbers
) TT
GROUP BY id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,GrpNumber
HAVING COUNT(*) >= 2
) TT
GROUP BY id
原来的答案:
这里有一个方法来做到这一点与基于集合的查询。这个查询假设你的表名为TableOfTen,并且它有10个[umber] [1..10]列。它可以修改任何预先知道n [number]列数量的表格(或派生表格)。
SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, MAX(GrpSize) MaxSize, COUNT(GrpNumber) NumberOfSetsWithTwoOrMoreMembers
FROM (
SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,GrpNumber, COUNT(*) GrpSize
FROM
SELECT id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,
CASE Numbers.N
WHEN 1 THEN n1 - N
WHEN 2 THEN n2 - N
WHEN 3 THEN n3 - N
WHEN 4 THEN n4 - N
WHEN 5 THEN n5 - N
WHEN 6 THEN n6 - N
WHEN 7 THEN n7 - N
WHEN 8 THEN n8 - N
WHEN 9 THEN n9 - N
WHEN 10 THEN n10 - N
END GrpNumber
FROM `mytbl`
CROSS JOIN (
SELECT 1 AS N UNION ALL
SELECT 2 AS N UNION ALL
SELECT 3 AS N UNION ALL
SELECT 4 AS N UNION ALL
SELECT 5 AS N UNION ALL
SELECT 6 AS N UNION ALL
SELECT 7 AS N UNION ALL
SELECT 8 AS N UNION ALL
SELECT 9 AS N UNION ALL
SELECT 10 AS N
) Numbers
) TT
GROUP BY id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,GrpNumber
HAVING COUNT(*) > 2
) TT
GROUP BY id, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10
好问题..告诉我,如果它会以更简单的方式解决 – Sami