代码之家  ›  专栏  ›  技术社区  ›  Chris B. Behrens

检测数据中的相关列

  •  1
  • Chris B. Behrens  · 技术社区  · 15 年前

    假设我有以下数据:

    OrderNumber  |  CustomerName  |  CustomerAddress  | CustomerCode
              1  |  Chris         |  1234 Test Drive  |          123
              2  |  Chris         |  1234 Test Drive  |          123
    

    如何检测“CustomerName”、“CustomerAddress”和“CustomerCode”列之间的完美关联?我认为Sql Server数据挖掘可能是这项工作的合适工具,但我在这方面没有太多经验。

    更新:

    所谓“相关”,我的意思是在统计学意义上,只要a列是x,b列就是y。在上述数据中,最后三列相互关联,而第一列不相关。

    操作的输入将是表的名称,输出类似于:

             Column 1     |    Column 2          | Certainty
          CustomerName    |  CustomerAddress     | 100%
          CustomerAddress |  CustomerCode        | 100%
    
    3 回复  |  直到 15 年前
        1
  •  0
  •   Eric    15 年前

    你说的关联是什么意思?你只是想看看他们是否平等吗?在T-SQL中,可以通过将表连接到自身来实现这一点:

    select distinct
        case when a.OrderNumber < b.OrderNumber then a.OrderNumber 
            else b.OrderNumber 
            end as FirstOrderNumber,
        case when a.OrderNumber < b.OrderNumber then b.OrderNumber 
            else a.OrderNumber 
            end as SecondOrderNumber
    from
        MyTable a
        inner join MyTable b on
            a.CustomerName = b.CustomerName
            and a.CustomerAddress = b.CustomerAddress
            and a.CustomerCode = b.CustomerCode
    

    这将返回给您:

    FirstOrderNumber  |  SecondOrderNumber
                   1  |                  2
    
        2
  •  0
  •   Paul Harrington    15 年前

    http://blogs.conchango.com/jamiethomson/archive/2008/03/03/ssis-data-profiling-task-part-7-functional-dependency.aspx

    我已经通过一些(文档不足的).NET API访问了data profiler输出,这似乎是可行的。然而,由于我的需求涉及列值的分布,因此我最终使用了基于DBCC统计输出的简单得多的方法。我对分析器组件和输出查看器的了解给我留下了深刻的印象。

        3
  •  0
  •   Kristian    9 年前

    相关性是在度量空间上定义的,并且您的值不是度量值。

    这将为您提供%的客户没有 customerAddress 唯一定义的 customerName :

    SELECT  AVG(perfect)
    FROM    (
            SELECT
              customerName,
              CASE
                WHEN COUNT(customerAddress) = COUNT(DISTINCT customerAddress)
                THEN 0
                ELSE 1
              END AS perfect
            FROM orders
            GROUP BY
              customerName
            ) q
    

    替换其他列,而不是 客户地址 客户名称 进入此查询以查找它们之间的差异。