ich habe ein kleines Problem. Ganz normale Abfrage eines Zeitraumes über das Datum.
SELECT * FROM tbl WHERE datum BETWEEN '2015-01-01' AND '2015-01-03'
Bekomme ich z.B. 5 Datensätze. Nun möchte ich aber nicht den jüngsten und ältesten Datensatz. In anderen SQLs schließt BETWEEN diese Datensätze eh aus. Wie kann ich das hier umsetzen?
meine Beschreibung war nicht ausreichend. Jetzt sehe ich das auch. Es ist so, dass pro Tag theoretisch nur ein Datensatz existiert, nun wurden aber versehentlich mehrere erzeugt. Nun muss ich alle Datensätze dieses Zeitraumes löschen, bis auf den ersten und den letzten. Wichtig ist, dass das die Datumsspalte “timestamp with tz” ist.
So aus der Hüfte geschossen, vielleicht etwas in dieser Richtung:
delete from the_table
where pk_column in (
select pk_column
from (
select pk_column,
row_number() over (partition by datum::date order by datum) as rn,
count() over (partition by datum::date) as day_count
from the_table
) t
where rn <> 1 and rn <> day_count
);
“pk_column” ist der Primärschlüssel.
Wenn der aus mehr als einer Spalte besteht, dann eben mit “where (col1, col2) in (select col1, col2 …”
Aber ohne weitere Details zu der Tabelle ist das wirklich schwierig zu beantworten.