T-SQL Query - Get Unikalne wiersze na 2 kolumny

głosy
5

Mam zestaw danych, z kolumnami x i y. Zestaw ten zawiera wiersze gdzie za 2 podanych wartości A i B znajduje się rząd z A i B w kolumnach x i y respectivly i będzie drugi rząd z B i A w kolumnach x i y respectivly.

Na przykład

        **Column X**            **Column Y**
Row 1        A                       B
Row 2        B                       A             
  • Istnieje wiele par danych w tym zestawie, który przestrzegać tej reguły.
  • Dla każdego wiersza z A, B w kolumnach X i Y, nie zawsze będzie rzędu z B, A, X i Y w
  • Kolumny X i Y są typu int

Muszę zapytanie T-SQL, że dany zestaw reguł powyżej powróci do mnie albo Wiersz 1 lub Row 2, ale nie jednocześnie.

Każda odpowiedź jest bardzo trudna, lub jej tak proste, że nie widzę lasu dla drzew, albo sposób to doprowadza mnie do ściany.

Utwórz 27/08/2009 o 01:10
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
9

Dodaj do zapytania orzecznika,

where X < Y

i nigdy nie można dostać rzędowym dwie, ale zawsze będzie się wierszowym.

(Przy założeniu, że kiedy pisał „dwie podane wartości” chodziło o dwa różne podanych wartości, jeśli obie wartości mogą być takie same, dodać predykat where X <= Y(aby pozbyć się wszystkich „odwrócone” wiersze gdzie X> Y), a następnie dodać distinctdo swojej listy select (zapaść jakieś dwa rzędy, gdzie X == Y w jednym rzędzie)).

W odpowiedzi na komentarze:

Oznacza to, że jeśli obecnie zapytanie jest select foo, x, y from sometable where foo < 3;zmienić go select foo, x, y from sometable where foo < 3 and x < y;lub za drugim przypadku (gdzie X i Y nie są różne wartości) select distinct foo, x, y from sometable where foo < 3 and x <= y;.

Odpowiedział 27/08/2009 o 01:20
źródło użytkownik

głosy
1

To powinno działać.

Declare @t Table (PK Int Primary Key Identity(1, 1), A int, B int);

Insert into @t values (1, 2);
Insert into @t values (2, 1);
Insert into @t values (3, 4);
Insert into @t values (4, 3);
Insert into @t values (5, 6);
Insert into @t values (6, 5);

Declare @Table Table (ID Int Primary Key Identity(1, 1), PK Int, A Int, B Int);
Declare @Current Int;
Declare @A Int;

Insert Into @Table 
Select PK, A, B 
From @t;

Set @Current = 1;    

While (@Current <= (Select Max(ID) From @Table) Begin    

    Select @A = A 
    From @Table 
    Where ID = @Current;        

    If (@A Is Not Null) Begin

        Delete From @Table Where B = @A;            
        If ((Select COUNT(*) From @Table Where A = @A) > 1) Begin
            Delete From @Table Where ID = @Current;
        End

    End

    Set @A = Null;  
    Set @Current = @Current + 1;

End

Select a.*
From @tAs a
    Inner Join @Table As b On a.PK = b.PK
Odpowiedział 27/08/2009 o 01:21
źródło użytkownik

głosy
0
SELECT O.X, O.Y
FROM myTable O
WHERE EXISTS (SELECT X, Y FROM myTable I WHERE I.X = O.Y AND I.Y = O.X)

Nie próbowałem tego. Ale to powinno działać.

Odpowiedział 27/08/2009 o 01:20
źródło użytkownik

głosy
0

Aby uzyskać najwyższy i najniższy z każdej pary można użyć:

(X+Y+ABS(X-Y)) / 2 as High, (X+Y-ABS(X-Y)) / 2 as Low 

Więc teraz używać DISTINCT uzyskać par nich.

SELECT DISTINCT 
  (X+Y+ABS(X-Y)) / 2 as High, (X+Y-ABS(X-Y)) / 2 as Low 
FROM YourTable
Odpowiedział 27/08/2009 o 01:19
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more