SQLite - returnera första raden för varje grupp
Jag har hittat lösningen själv. Man använder något som heter "window functions", vilket är något jag inte kände till sedan innan. De funkar lite som GROUP BY, men istället för att "slå ihop" rader med identiska kolumner kan man skapa en ny kolumn för varje rad med ett värde som har med gruppen att göra.
Jag skymtade detta i Stackoverflow-svaren när jag sökte på frågan innan jag startade den här tråden, men fick för mig att det var något specifikt för SQLite och en "hackig lösning" och jag ville hellre ha en mer generell lösning, men window functions är tydligen standard i SQL även om det som vanligt är lite småskillnader mellan olika implementationer.
Här är två videos som går igenom det hela som jag tyckte var hyfsat bra, den första är mer teoretisk och den andra mer praktisk med exempel:
https://www.youtube.com/watch?v=e-EL-6Vnkbg
https://www.youtube.com/watch?v=Ww71knvhQ-s
Så svaret på hur man gör är ungefär detta (har inte testkört eftersom min frågeställning var en förenkling och min verkliga tabell och select är lite mer komplicerad):
SELECT
directory,
name,
hash
FROM (
SELECT
directory,
name,
hash,
ROW_NUMBER() OVER (PARTITION BY hash ORDER BY directory, file_name) AS rn
FROM files)
WHERE rn = 1
ORDER BY directory, file_name
Den inre SELECT:en returnerar alla rader, med kolumnen "rn" tillagd där rader i varje grupp (dvs rader med identisk hash) får ett värde på rn beroende på vilken alfabetisk ordning de kommer i inom gruppen, dvs raden med lägst (directory,name) får värde 1, nästa får värde 2 osv. Den yttre selecten kastar helt enkelt alla rader där rn inte är 1, och sorterar resultatet på directory, file_name.
- Kampanj: SweClockers Hexagon XXL Musmatta (Slutsåld!)63
- Intels Nova Lake-S nära färdigställda24
- Quiz: Vad kan du om gamingskärmar?53
- Låst till 60hz3
- Dagens fynd (bara tips, ingen diskussion) — Läs första inlägget först!21k
- CRT tjock tv reperatör i södra Sverige?16
- Tråden om PlayStation 5 | Slim | PRO20k
- Budgetbygge0
- Proxyproblem vid vissa sidor!1
- Tips på övervakningskamera utomhus0
- Köpes DDR4 2133 SODIMM – 8-16 GB
- Köpes Dator till 10-åring - MC, Roblox, Fortnite
- Säljes Remarkable 2 inkl Type Folio och Marker Plus
- Säljes Phanteks RGB vertical GPU riser & bracket (VIT)
- Köpes Vattenblock till Asus tuf rtx 3080
- Säljes Efterflytt-rensning deluxe – i9 11900K + Z590 + DDR4, Emotiv EEG-headset, nätverk, fläktar m.m.
- Säljes iPad Air 11 (2024) M2 128GB WiFi (Purple)
- Säljes Mini-ITX Gaming-PC med 4070 Ti & Ryzen 7800X3D
- Säljes LG C3 65 inch OLED + Philips Hue Gradient Lightstrip 65 inch
- Säljes ITX dator, RTX5080 FE + Ryzen 9700x
- Sapphires moderkort närmar sig lansering13
- Quiz: Vad kan du om gamingskärmar?53
- MSI: 533 dagar senare - knappt någon OLED-inbränning88
- Intels Nova Lake-S nära färdigställda24
- Bättre stöd för Bluetooth-headset i Windows 1140
- AMD Ryzen Threadripper 9980X & 9970X – bäst i klassen18
- Här är de fem första rekryterna till Battlefield 6: Slaget14
- Framework lanserar RTX 5070-bestyckade Laptop 1612
- Veckans fråga: Vad är viktigast när du väljer skärm?80
- Nytt världsrekord i CPU-frekvens20
Externa nyheter
Spelnyheter från FZ
- FZ High Score-säsongen i mål – Vi har en... nej, två vinnare idag
- Bethesda antyder riktiga rymdresor i Starfield idag
- Diskutera – Tidernas bästa co-op-spel är... idag
- Gears of War: Reloaded sågas på Steam – försvunnet split-screen och krascher idag
- Det episka quizzet – Unreal! Gears of War! Fortnite! idag