2017-05-05 89 views
2

我想在SQL中复制一个Python函数,但我很难从表和循环/迭代的角度考虑它。Python的itertools.combinations()的SQL版本

import itertools 
rangeStart = 1 
rangeEnd = 20 
rangeStep = 2 
outputSize = 3 

lst = range(rangeStart, rangeEnd, rangeStep) 

list = list(itertools.combinations(lst, outputSize)) 
print(len(list)) 

如何可以复制在SQL上述Python代码的输出,同时仍然允许用于输入(以能够配合到输入字段中一个用户接口)?

具体而言,输出应该是排列,而不是组合。我基本上试图从GUI中输入一些输入,他们在那里输入范围(即0,20),值的类型(偶数,奇数或全部)以及输出中每个元组的长度。输出是一个被排序的元组列表,所以(1,2,3)是好的,(2,3,1)或(1,3,2)是不好的。元组的值也从左到右递增,因此(2,4,6)是好的,但(6,4,2)不是。元组中的值也是唯一的,所以(4,4,6)不好。

+0

如果输出应该是排列组合,然后你想要的'itertools.permutations',不'itertools.combinations' –

回答

1

使用递归cte从1到20生成奇数,然后使用一系列cross join s。

with t(val) as (select 1 union all select val+2 from t where val<19) 
select * 
from t t1 
cross join t t2 
cross join t t3 
where t1.val<t2.val and t2.val<t3.val 

这会在列表中生成当前以行形式存在的元组。

Sample Demo

+0

正是我一直在寻找的eqivalent!谢谢! – happyhippo83