返回求和列的所有排列的SQL

时间:2017-05-23 16:40:15

标签: sql sql-server

在这里黑暗中拍摄。我个人很难想出一个简单的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分钟" (该字段是一个持续时间字段),这导致了关于如何处理它的其他问题,但让我看看我是否可以在实际变得更复杂之前获得排列。

感谢。

3 个答案:

答案 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)