SQL sqlite: maximal n zeilen je id

striker159

Lt. Junior Grade
Registriert
Dez. 2008
Beiträge
328
hallo
ich habe eine tabelle mit den spalten
(fid foreign key integer, info string, timestamp integer).

die daten könnten zb so aussehen, mit ungefähr 10000 verschiedenen fids:

1 'a' 1000
1 'b' 1234
1 'c' 1472
2 'b' 1234
2 'c' 1472
...

könnte mir jemand sagen, mit welchem query ich nur die neusten n zeilen je fid behalte und alle anderen lösche?
ich weiß nicht, wie ich beide bedingungen ( je gruppe und n pro gruppe) zusammenbringe.
 
Code:
DROP TABLE IF EXISTS tbl;
CREATE TABLE IF NOT EXISTS tbl (
	fid integer,
	info string,
	"timestamp" integer
);

INSERT INTO tbl VALUES
(1,'a',1000),
(1,'b',1234),
(1,'c',1472),
(2,'b',1234),
(2,'c',1472);

SELECT * FROM tbl;

DELETE FROM tbl
WHERE "timestamp" NOT IN (
	SELECT MAX("timestamp")
	FROM tbl i
	WHERE
		tbl.fid = i.fid
);

SELECT * FROM tbl;
Code:
fid info timestamp 
--- ---- --------- 
1   a    1000      
1   b    1234      
1   c    1472      
2   b    1234      
2   c    1472      

(5 row(s) affected)

fid info timestamp 
--- ---- --------- 
1   c    1472      
2   c    1472      

(2 row(s) affected)
So oder anders?
 
Nicht ganz. Wie ich das sehe behält dein Delete für jede fid nur den neuesten Wert. Ich benötige die n neusten Werte je fid. (n konstant).

Für n = 2 sollte
Code:
1 'b' 1234
1 'c' 1472
2 'b' 1234
2 'c' 1472
übrigbleiben.

Edit: Ich habe es Dank deinem Vorschlag hinbekommen. Einfach nicht das Maximum, sondern alle absteigend sortiert und davon nur die ersten n einträge

Code:
DELETE FROM tbl
WHERE timestamp NOT IN (
	SELECT timestamp
	FROM tbl i
	WHERE
		tbl.fid = i.fid
	ORDER BY timestamp DESC
	LIMIT 2
);
 
Zuletzt bearbeitet:
Zurück
Oben