2017-08-08 1 views
1

Ich habe eine Tabelle, die ähnliche Daten enthält.SQL-Abfrage: Identifizieren Sie ähnliche Werte in zwei Spalten

To From Rule 
01 02 E 
01 03 E 
01 04 E 
02 03 E 
02 01 E 
03 02 E 
04 01 E 

Also, 01-02 sind die gleichen wie 02-01. Ich möchte eine Abfrage schreiben, um einzigartige Paare zu haben. Ergebnismenge sollte entweder 01-02 oder 02-01 enthalten, aber nicht beides.

Ich bin durch viele Beiträge gegangen, aber nicht in der Lage, herauszufinden, wie dies zu erreichen ist. Wenn jemand auf dieses Problem gestoßen ist, schlagen Sie bitte die Lösung vor.

Ergebnis Set Erwartet:

To From Rule 
01 02 E 
01 03 E 
01 04 E 
02 03 E 

Antwort

2

Einfache und einfache Rücksendung des genauen Ergebnisses, das Sie erhalten möchten.

SELECT * from 
(
    select 
(case when _to<_from then _to else null end) as _to, 
(case when _from>_to then _from else null end) as _from, 
_rule 
from _work 
) as [Stay_happy_:P] 
where 
_to is not null and _from is not null 

Ich habe die Testumgebung Ihrer Daten und ausgewählt über obige Abfrage ->here

1

Was Sie tun müssen, ist, Daten zu normalisieren. Eine Möglichkeit besteht darin, From und To zu tauschen, sodass der kleinere Wert immer in From liegt.

Dann verwenden Sie ROW_NUMBER Fensterfunktion, um Gruppen zu berechnen.

Abfrage:

SELECT * 
FROM 
    (SELECT *, 
     ROW_NUMBER() OVER(PARTITION BY 
      -- If From is bigger than To than swap them 
      (CASE WHEN [To] < [From] THEN [To] ELSE [From] END), 
      (CASE WHEN [To] < [From] THEN [From] ELSE [To] END) ORDER BY NULL) AS PairNum 
    FROM [some table]) AS Groups 
WHERE PairNum = 1 

Hinweis: wenn Ihre Version von SQL Server beschwert sich über ORDER BY NULL dann NULL mit einigen Spaltennamen ersetzen z.B. ID

1

andere Art und Weise Ihr Problem

select [To],[From] from #temp_t where [To]<[From] 
union 
select [From],[To] from #temp_t where [From]<=[To] 
+0

Sie müssen für Szenario wo [To] = [Von] – Alex

+0

@Alex Ich denke, jetzt werde ich es nclude-Bedingung [Von] = [Zu] – Mat

0

Versuchen Sie, diese Skripte zu lösen,

create table #t (id int identity(1,1),Tos varchar(10) not null 
,Froms varchar(10) not null,Rules varchar(10)) 


insert into #t VALUES 
('01','02','E'),('01','03','E') 
,('01','04','E'),('02','03','E') 
,('02','01','E'),('03','02','E') 
,('04','01','E') 

; 

WITH CTE 
AS (
    SELECT t.* 
     ,c.id id1 
    FROM #t t 
    CROSS APPLY (
     SELECT * 
     FROM #t c 
     WHERE c.id > t.id 
      AND c.tos = t.froms 
      AND c.Froms = t.Tos 
     ) c 
    ) 
    ,CTE1 
AS (
    SELECT t.* 
    FROM #t t 
    WHERE NOT EXISTS (
      SELECT * 
      FROM cte c 
      WHERE c.id = t.id 
       OR c.id1 = t.id 
      ) 
    ) 
SELECT tos 
    ,froms 
    ,rules 
FROM cte 

UNION ALL 

SELECT tos 
    ,froms 
    ,rules 
FROM cte1 

DROP TABLE #t 
Verwandte Themen