Erkennen korrelierte Spalten in Daten
-
11-09-2019 - |
Frage
Angenommen, ich habe folgende Daten:
OrderNumber | CustomerName | CustomerAddress | CustomerCode
1 | Chris | 1234 Test Drive | 123
2 | Chris | 1234 Test Drive | 123
Wie kann ich erkennen, dass die Spalten „Kundenname“, „Customer“ und „CustomerCode“ alles perfekt korrelieren? Ich denke, dass SQL Server Data Mining wahrscheinlich das richtige Werkzeug für den Job ist, aber ich habe nicht zu viel Erfahrung damit.
Vielen Dank im Voraus.
UPDATE:
Mit dem „korrelieren“, ich meine in der Statistik Sinn, dass, wenn Spalte ein x, Spalte b y sein wird. In den obigen Daten, die letzten drei Spalten korrelieren miteinander, und die erste Spalte nicht.
Der Eingang des Betriebes wäre der Name der Tabelle, und der Ausgang wäre so etwas wie:
Column 1 | Column 2 | Certainty
CustomerName | CustomerAddress | 100%
CustomerAddress | CustomerCode | 100%
Lösung
Es gibt einen ‚funktionale Abhängigkeit‘ Test in die Komponente SQL Server Datenprofil gebaut (das ist eine SSIS-Komponente, die im Lieferumfang von SQL Server 2008). Es wird beschrieben, ziemlich gut auf diesem Blog-Eintrag:
Ich habe ein wenig mit dem Zugriff auf die Daten-Profiler-Ausgabe über einige gespielt (unter dokumentierten) .NET APIs und es scheint machbar. Da jedoch meine Anforderung mit der Verteilung von Spaltenwerten behandelt, landete ich mit etwas viel einfacher basierend auf der Ausgabe von DBCC STATISTIK steigen. Ich war ziemlich beeindruckt von dem, was ich von der Profiler Komponente sah und die Ausgabe-Viewer.
Andere Tipps
Was meinst du mit Korrelat? Wollen Sie nur um zu sehen, ob sie gleich sind? Sie können das tun in T-SQL, indem Sie die Tabelle mit sich selbst verbinden:
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
Dies würde zurückkehren Sie:
FirstOrderNumber | SecondOrderNumber
1 | 2
Die Korrelation wird auf metrische Räume definiert sind, und Ihre Werte sind nicht metrisch.
Dies gibt Ihnen Prozent der Kunden, die eindeutig durch customerAddress
definiert haben nicht 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
Ersetzen andere Spalten statt customerAddress
und customerName
in diese Abfrage Diskrepanzen zwischen ihnen zu finden.