Обнаружение коррелированных столбцов в данных - PullRequest
1 голос
/ 04 июня 2009

Предположим, у меня есть следующие данные:

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

Как я могу определить, что столбцы "CustomerName", "CustomerAddress" и "CustomerCode" полностью соответствуют друг другу? Я думаю, что Sql Server Data Mining, вероятно, является подходящим инструментом для работы, но у меня не слишком много опыта с этим.

Заранее спасибо.

UPDATE:

Под "коррелятом" я подразумеваю в смысле статистики, что всякий раз, когда столбец a равен x, столбец b будет y. В приведенных выше данных, последние три столбца коррелируют друг с другом, а первый столбец нет.

Вводом операции будет имя таблицы, а выводом будет что-то вроде:

         Column 1     |    Column 2          | Certainty
      CustomerName    |  CustomerAddress     | 100%
      CustomerAddress |  CustomerCode        | 100%

Ответы [ 3 ]

0 голосов
/ 04 июня 2009

Корреляция определена в метрических пространствах, а ваши значения не являются метрическими.

Это даст вам процент клиентов, у которых 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

Замените в этом запросе другие столбцы вместо customerAddress и customerName, чтобы найти расхождения между ними.

0 голосов
/ 05 июня 2009

В компонент профилирования данных SQL Server встроен тест «функциональной зависимости» (компонент SSIS, поставляемый с SQL Server 2008). Это очень хорошо описано в этом посте:

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

Я немного поигрался с доступом к выходу профилировщика данных через некоторые (недостаточно документированные) .NET API, и это кажется выполнимым. Однако, так как мое требование касалось распределения значений столбцов, я закончил тем, что сделал нечто гораздо более простое, основываясь на выводе DBCC STATISTICS. Я был очень впечатлен тем, что увидел в компоненте профилировщика и в программе просмотра вывода.

0 голосов
/ 04 июня 2009

Что вы подразумеваете под коррелятом? Вы просто хотите увидеть, равны ли они? Вы можете сделать это в 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
...