Ich mag gerne wissen, ob es möglich ist, die folgenden mit einem einzigen SQLite-Anweisung zu tun:SQLite-Äquivalent row_number() über (Partition ...
Meine Tabelle sieht wie folgt aus:
|AnId|UserId|SomeDate|SomeData|
|123 |A |1/1/2010|aadsljvs|
| 87 |A |2/9/2010|asda fas|
|193 |A |2/4/2010|aadsljvs|
|927 |A |7/3/2010|aadsasdf|
|816 |B |1/1/2010|aa32973v|
|109 |B |7/5/2010|aaasfd10|
| 39 |B |1/3/2010|66699327|
...
Jede Reihe hat eine eindeutige ID, eine Benutzer-ID, einen Datetime-Wert, und einige anderen Daten.
ich Aufzeichnungen löschen möchte, damit ich die neuesten 10 Datensätze pro Benutzer halten, basierend auf SomeDate.
in SQL Server würde ich so etwas wie folgt verwenden:
delete d
from data d
inner join (
select UserId
, AnId
, row_number() over (partition by UserId order by SomeDate desc)
as RowNum
from data
) ranked on d.AnId = ranked.AnId
where ranked.RowNum > 10
Gibt es eine Möglichkeit, dies in SQLite zu tun? Der Randfall, bei dem es mehrere Datensätze mit dem gleichen SomeDate gibt, ist keine besondere Sorge, z. wenn ich alle diese Aufzeichnungen aufbewahre, wäre das in Ordnung.
sicher, ich kann es prozedural tun, aber ich mag einen Weg, es in einem einzigen zu tun Aussage wenn möglich. Wenn es prozedural gemacht wird, wäre es auch möglich, eine einzelne Anweisung pro Benutzer zu verwenden, und nur für die Benutzer mit Datensätzen in der Tabelle – Rory
Ah, yeah; Ich habe keine Ahnung. Aus Neugier, wie können Sie es in einer einzigen Anweisung pro Benutzer tun? – sbirch
Nun, das ist die Frage! Die Syntax in der Frage zeigt, wie man es in SQL Server macht. Ich weiß nicht, ob dies in SQLite möglich ist. Ich vermute nicht. – Rory