2017-01-05 6 views
0

Ich habe eine Postgres-Tabelle mit Datensätzen, die viele neue Filed Accounts mit reg_number und viele Filed Accounts enthalten, die nun mit derselben reg_number finalisiert sind.Auswählen von Datensätzen mit doppelter Nummer in einer Spalte und einer eindeutigen Zeichenfolge in einer anderen

Ich kann nicht nach Datum oder Zeilennummer wegen Inkonsistenzen abfragen.

Ich muss auswählen können:
Alle Filed Reihen -, die noch nicht abgeschlossen sind und,
Alle Fertiggestellt Reihen aber nicht ihre ursprüngliche ‚eingereicht‘ Reihe.

Source Data Tabelle

reg_num | file_final | otherCols 
1234  | filed  | foo 
1234  | final  | foo 
1235  | filed  | foo 
1218  | filed  | foo 
1111  | final  | foo 
1235  | final  | foo 

Gewünschte auswählen:

reg_num | file_final | otherCols 
1234  | final  | foo 
1218  | filed  | foo 
1111  | final  | foo 
1235  | final  | foo 

ich eine Reihe von Kombinationen von SELECT DISTINCT ON versucht haben, und schließt sich aber bin fest.
Die zwei relevanten Felder sind oben gezeigt und die Gesamttabelle hat ungefähr 25 andere Spalten,
, die ich auswählen können muss.

Jede Hilfe wäre willkommen. Vielen Dank!
Einige Abfragen habe ich versucht (unter 10 +) umfassen:

SELECT * FROM
ca_enforce
WHERE reg_number IN
(
DISTINCT ON (reg_number SELECT) reg_number
WHERE file_final = 'Final' OR file_final = 'Filed'
GROUP BY Regnummer
);

Ein anderer:

ON reg_number SELECT DISTINCT,
id,
col3,
col4,
file_final,
Col6,
COL7,
reg_number
WHERE file_final = 'Final'
FROM my_table
BESTELLEN B Y Datei_Final;

Antwort

0

Die Gewerkschaft Techniken Kraft PostGreSQL bis zweimal durch die Daten übergeben.

Mit einem Index auf der reg_num Spalte die folgende Abfrage schneller ausführen soll:

select reg_num, file_final, otherCols 
from t t1 
where file_final = 'final' or not exists (
    select * 
    from t t2 
    where t2.reg_num = t1.reg_num and t2.file_final = 'final'); 
+0

Dank beiden Antworten. Ich akzeptierte dieses, da es die Ergebnisse mit dem geringsten Optimieren gab ... und das nur, weil ich beide Tabellenreferenzierungen auf denselben schema.table-Namen ändern musste. Vielen Dank!Dadurch wurde ein großer Fehler in der Methodik der Datenquelle aufgedeckt, wo sie ungefähr 30% der Datensätze falsch klassifizierten. – enjoypb

0

Klingt wie zwei Abfragen, die Vereinigung zusammen all'd werden können:

--get all of the filed records that don't have final records. 
select reg_num 
from my_table 
where reg_num not in (
    select reg_num 
    from my_table 
    where final_file = 'final' 
) 
where final_file = 'file' 

union all 
--get all of the final records. 
select reg_num 
from my_table 
where file_final = 'final' 
0
select reg_num,file_final,othercols 
from table_name 
where reg_num not in (
       select reg_num 
       from table_name 
       where final_file = 'final' 
        ) 
union all 
select reg_num,file_final,othercols 
from table_name 
where file_final = 'final' 
Verwandte Themen