2016-07-30 11 views
0

Ich habe eine Postgres-DB-Tabelle, die vierteljährliches Ereignis, vierteljährliches Ereignisdatum und Kosten protokolliert. Jede Veranstaltung hat mindestens 5 Viertel der Informationen, einige Ereignisse haben 8 oder mehr Quartale.SQL-Abfrage, Zeilen basierend auf der Anzahl der Datumseinträge zurückgeben

Beispieltabelle

EventA | 2013-01-01 | 500 EventA | 2013-04-01 | 600 EventA | 2013-07-01 | 700 EventA | 2013-10-01 | 700 EventA | 2014-01-01 | 750 EventB | 2013-01-01 | 400 EventB | 2013-04-01 | 500 EventB | 2013-07-01 | 600 EventB | 2013-10-01 | 600 EventB | 2014-01-01 | 575 EventB | 2014-04-01 | 700 EventB | 2014-07-01 | 750 EventB | 2014-10-01 | 800 EventB | 2015-01-01 | 800 EventB | 2015-04-01 | 840

Ich möchte in der Lage sein, die folgenden über eine Abfrage zu tun. Wenn ein Ereignis 6 oder weniger Zeilen aufweist, geben Sie die Zeile für das erste Quartal und die letzte Zeile zurück. Wenn ein Ereignis 7 oder mehr Quartale hat, geben Sie die letzte Viertelreihe (letztes Datum) und das 6. Viertel zurück. Das heißt, wenn eine Veranstaltung 3 Jahre Information hat, 12 Quartale, würde ich gerne das 12. Quartal und das 6. Quartal sehen.

Ich weiß, wie man eine Fensterfunktion verwendet, um eine Viertelzählung nach Ereignis zurückzugeben und eine Unterabfrage zu verwenden, um die Ergebnisse basierend auf der Anzahl der Quartale eines Ereignisses zu erhalten, dh weniger als 6 oder größer als 10. Danach bin ich stecken. Ich denke, ich müsste diese Ergebnissätze nehmen und sie verbinden, um die Zeilen zurückzugeben, nach denen ich suche, aber ich weiß nicht, wie ich das machen soll.

So Beispieldaten aus obigem Beispiel wäre zurück

EventA | 2013-01-01 | 500 EventA | 2014-01-01 | 750 EventB | 2013-10-01 | 600 EventB | 2015-04-10 | 840

Vielen Dank im Voraus

+0

Fehlende: Postgres-Version, Tabellendefinition, Abfrage, die Sie versucht haben. –

Antwort

1

Beispieldaten:

create table events (event text, quarter date, cost integer); 
insert into events values 

('EventA', '2013-01-01', 500), 
('EventA', '2013-04-01', 600), 
('EventA', '2013-07-01', 700), 
('EventA', '2013-10-01', 700), 
('EventA', '2014-01-01', 750), 
('EventB', '2013-01-01', 400), 
('EventB', '2013-04-01', 500), 
('EventB', '2013-07-01', 600), 
('EventB', '2013-10-01', 600), 
('EventB', '2014-01-01', 575), 
('EventB', '2014-04-01', 700), 
('EventB', '2014-07-01', 750), 
('EventB', '2014-10-01', 800), 
('EventB', '2015-01-01', 800), 
('EventB', '2015-04-01', 840); 

Select:
- eine Zeilennummer in absteigender Reihenfolge und
- eine Reihe von Zeilen in pa rtitions von Ereignisse

und wählt:
- erste Zeile in einer Partition und
- siebte oder letzte Zeile je nachdem, welche Zahl kleiner ist.

select event, quarter, cost 
from (
    select 
     *, 
     row_number() over (partition by event order by quarter desc) rn, 
     count(*) over (partition by event) maxn 
    from events 
    ) s 
where rn = 1 or rn = least(maxn, 7) 
order by 1, 2; 

event | quarter | cost 
--------+------------+------ 
EventA | 2013-01-01 | 500 
EventA | 2014-01-01 | 750 
EventB | 2013-10-01 | 600 
EventB | 2015-04-01 | 840 
(4 rows) 
+0

Danke, Klin, ich würde das oft wiederholen, wenn ich könnte. Ich dachte nicht, dass die Lösung so einfach wäre. Ich hatte diese Abfrage, aber ich hatte die WHERE-Klausel nicht korrekt. – tman

Verwandte Themen