这很简单,但我不确定最好的方法是计算这个,我是数据编程的新手。 我有一个包含5列和2个值Y和N的表。如何在行中获得Y和N的所有唯一可能组合?这可能是任何两个值,但我使用的是Y和N.屏幕截图和视觉下方的我试图手动执行此操作。
YYYYY
NNNNN
YNYNY
NYNYN
NYYYY
NNYYY
NNNYY
NNNNY
答案 0 :(得分:3)
从一个更简单的问题开始。 零 Y或N有多少独特的组合?只有一个:没有元素的组合。
一个 Y或N有多少个独特的组合?有两个:
N Y
两个 Y或N有多少个独特的组合?有四个:
NN NY YN YY
三?有八个:
NNN NNY NYN NYY YNN YNY YYN YYY
0有1,1有2,有2有4,3有8,...你现在应该猜到k Y N的k组合有两个。
我们通过以下算法从旧组合形成新组合:
如果最后一个例子不清楚,让我们再看一下3。我们首先解决2的问题:
NN NY YN YY
然后我们加倍
NN NN NY NY YN YN YY YY
然后我们添加N,Y,N,Y,N,Y,N,Y来获得
NNN NNY NYN NYY YNN YNY YYN YYY
在数据语言中,此操作是具有本身的序列的笛卡尔积。它也被称为“交叉连接”,因为它在带有X交叉的代数中表示。这是{N,Y} x {N,Y} x {N,Y} x {N,Y} x {N,Y}
。
练习:对于包含三个元素{A,B,C}的序列,您会如何做?有多少种k元素组合?
练习:订购10个Y或N的方式有多少,每个只有5个?你会如何产生那些组合?同样,从一个更简单的问题开始,并推动您解决更难的问题。
进一步阅读:如果您对如何在C#中执行这些操作感兴趣,多年来我已经写了很多文章:
https://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/
https://ericlippert.com/2013/04/15/producing-permutations-part-one/
https://ericlippert.com/2014/10/13/producing-combinations-part-one/
答案 1 :(得分:1)
我会使用五行来源的CROSS JOIN。
SELECT t1.custom1
, t2.custom2
, t3.custom3
, t4.custom4
, t5.custom5
FROM ( SELECT 'Y' AS custom1 UNION ALL SELECT 'N' ) t1
CROSS
JOIN ( SELECT 'Y' AS custom2 UNION ALL SELECT 'N' ) t2
CROSS
JOIN ( SELECT 'Y' AS custom3 UNION ALL SELECT 'N' ) t3
CROSS
JOIN ( SELECT 'Y' AS custom4 UNION ALL SELECT 'N' ) t4
CROSS
JOIN ( SELECT 'Y' AS custom5 UNION ALL SELECT 'N' ) t5
ORDER
BY t1.custom1 DESC
, t2.custom2 DESC
, t3.custom3 DESC
, t4.custom4 DESC
, t5.custom5 DESC