在这里黑暗中拍摄。我个人很难想出一个简单的SQL语句来执行以下操作(如果它甚至可以完成),所以我想我会把它扔出去:
我们说我们有以下数据:
ID VALUE
-- -----
1 60
2 60
3 60
4 60
我想找到SUM到120的记录的所有排列。意思是,结果将是6行:
1 AND 2
1 AND 3
1 AND 4
--2 AND 1 (already used)
2 AND 3
2 AND 4
--3 AND 1 (already used)
--3 AND 2 (already used)
3 AND 4
他们实际上想要一个"随机抽样"结果集,但我需要知道我是否能得到结果集。当然,真实的数据不会那么简单(一切都是60),而且这个问题被提出为" 10条记录,最多相加5分钟" (该字段是一个持续时间字段),这导致了关于如何处理它的其他问题,但让我看看我是否可以在实际变得更复杂之前获得排列。
感谢。
答案 0 :(得分:1)
select l.id, r.id, l.value+r.value as sum
from t l
inner join t r
on l.id < r.id
where l.value+r.value = 120
order by l.id, r.id
rextester演示:http://rextester.com/FWCLT49699
返回:
+----+----+-----+
| id | id | sum |
+----+----+-----+
| 1 | 2 | 120 |
| 1 | 3 | 120 |
| 1 | 4 | 120 |
| 2 | 3 | 120 |
| 2 | 4 | 120 |
| 3 | 4 | 120 |
+----+----+-----+
答案 1 :(得分:1)
这些是组合,而不是排列。如果您想要所有双向组合,请使用自联接:
select t1.*, t2.*
from t t1 join
t t2
on t1.id < t2.id and
t1.value + t2.value = 60;
对于大约10%的随机样本,您可以使用:
select t1.*, t2.*
from t t1 join
t t2
on t1.id < t2.id and
t1.value + t2.value = 60
where rand() < 0.1;
答案 2 :(得分:1)
表Tvalues
ID VALUE
-- -----
1 60
2 60
3 60
4 60
Select A.ID, B.ID from TValues A
join TValues B on B.ID != A.ID
where
(A.Value+B.Value) = 120
and
A.ID < B.ID -- eliminates dups, if (1,3) is printed, (3,1 will not be printed)