2017-03-24 2 views
1

Ich habe eine Tabelle, die wie dieses ich die Tabelle wiePostgres kommen auf einem Tisch

years type  x  y 
1  b  3.74637 -0.52816 
1  mon1  0  0 
1  mon10 0.00413 0.00137 

deshalb aussehen wollen

years type  value x  y 
1  b  3.74637 false true 
1  b  -0.52816 true false 
1  mon1  0  true false 
1  mon1  0  false true 
1  mon10 0.00413 true false 
1  mon10 0.00137 false true 

sieht ich eine Anfrage erstellen, wo ich in der Tabelle auf sich

beitreten
SELECT 
    i.years, 
    i.type, 
    i.value as b, 
    j.value as m 
from abc as i 
inner join abc as j on i.type = j.type AND i.years = j.years 
WHERE i.type = j.type AND i.m = j.b 

jetzt bekomme ich

years type x  y 
1  b  3.74637 -0.52816 
1  b  -0.52816 3.74637 
1  mon1 0  0 
1  mon1 0  0 
1  mon10 0.00413 0.00137 
1  mon10 0.00137 0.00413 

wie werde ich der Dubletten zu befreien, wo der x-Wert von einer Linie zur y der nächsten Zeile

+0

Was ist die Logik für x- und y-Spalten? –

+0

Wenn x wahr ist, dann ist y falsch und umgekehrt, aber das ist redundant und war ursprünglich ein Hinweis darauf, woher die Werte kamen, aber es ist mir egal, dass beide Werte kommen, weil ich x UND y zu berechnen brauche, also will ich x und y mit dem gleichen Typ und Jahr als Ergebnis – aldr

Antwort

0

Subqueries gleich ist: kann

select x1.*, y2.y 
from 
(
    select years, type, value as x 
    from MyTable 
    where x = 'true' 
) x1 
left join 
(
    select years, type, value as y 
    from MyTable 
    where y = 'true' 
) y2 
on x1.years = y2.years 
and x1.type = y2.type 
+1

Ich akzeptierte Ihre Antwort, weil es meine Art zu denken aussieht, aber die Antwort von GurV ist sehr elegant und smart – aldr

+0

Keine Notwendigkeit für eine Unterabfrage, bitte verwenden Sie dies nicht in Ihrem Code . Sehen Sie sich meine Antwort für eine bessere Lösung an. –

2

Sie verwenden Aggregation:

Select years, type, 
    Max (case when x then value end)as x, 
    Max (case when y then value end)as y 
From t 
Group by years, type 
2

x und y Unter der Annahme, sind echte boolean Spalten:

select xv.years, xv.type, xv.value as x, yv.value as y 
from abc xv 
    join abc yv on (xv.years, xv.type) = (yv.years, yv.type) and yv.y 
where xv.x; 

Online Beispiel: http://rextester.com/TUQPQH27415

+0

danke für den Link, der Tool scheint nützlich – aldr

1

Sie brauchen nicht nichts extra zu tun, aber einige zusätzliche Einschränkungen für die Verbindung hinzufügen. Sie wollen die Unterabfragen wirklich nicht machen, da es ohne Grund einen Leistungseinbruch gibt.

SELECT 
    i.years, 
    i.type, 
    i.value as b, 
    j.value as m 
from abc i 
inner join abc j on i.type = j.type and i.x = true and j.y = true; 
Verwandte Themen