erlang实现排列组合问题

今天在公司做一个日志分析的任务,在做统计的时候,遇到这样一个问题,

之前已经将数据拆分好,出现这样一张中间表Table,简略写如下:

A属性  B属性  C属性  D属性

1         3          5         7

2         4          6         8

现在A属性 B属性 C属性 D属性代表Table表中的四个字段,他们的value有多个,四个属性都是不为空的,现在需要计算出A属性、B属性、C属性、D属性分别组合之后的组合在Table表中的存在数据条数。

因为把这张分析的中间表放入数据库,本来初期是想SQL语句进行查找,不过可能由于SQL知识比较弱,所以还没想到很好的SQL语句,感觉这样的查找即使写出来,也可能效率很低吧~ 有朋友知道可以告诉我哈~* _ *~

所以转变了一下思路,

1 先通过sql语句group_by 来查找每个字段有几个不同的value值,比如:

select A from Table group_by A;

这样就获取了A属性、B属性、C属性、D属性分别存在的不同value值;

2 现在就需要获取到可能的排列情况喽~由于我目前在用erlang开发项目,自然想到用erlang去实现这样一个功能函数啦~

代码附上:

calc_group(A, B, C, D) ->
    %A = [1,2], B = [3,4], C = [5,6], D = [7,8],
    Result = lists:foldl(fun(A1, Acc) ->
                Result1 = lists:foldl(fun(B1, Acc2) ->
                            Result2 = lists:foldl(fun(C1, Acc3) ->
                                        Result3 = lists:foldl(fun(D1, Acc4) ->
                                            [{A1, B1, C1, D1} | Acc4]
                                            end, [], D),
                                        %lager:log(info, self(), "Result3:~p", [Result3]),
                                        Acc3 ++ Result3                                    
                                end, [], C),
                            %lager:log(info, self(), "Result2:~p", [Result2]),
                            Acc2 ++ Result2                          
                end, [], B),
                %lager:log(info, self(), "Result1:~p", [Result1]),
                Acc ++ Result1
        end, [], A),
    Result.

第一次写这样的链表操作,一个套一个啊(惶恐哦)~~不知道在数据量较大的时候会不会影响太大,目前是还没有测试阶段,不知道线上效果如何,谁还有没有更好的方法呢?

3 最后这一步就好做了,通过获取到的排列组合,可以用sql获取count啦~

这就是今天早上做的第一个任务,做一个简单的统计分析的工作,当然还没有界面,估计后期要用php做个界面给非技术人员统计查看~fighting~

原文地址:https://www.cnblogs.com/kongqueling/p/kongqueling_Permutation-and-Combination.html