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.
- Microsoft bekräftar SSD-problem36
- Tråden för hörlursgalningar! Lurar, förstärkare, dacs, pads osv osv It´s all here!20k
- Dagens fynd — Diskussionstråden55k
- Hdmi Splitter hjälp8
- Server dator5
- Aggressivare påminnelser om att uppgradera Windows 10130
- Nytt världsrekord i CPU-frekvens10
- Snälla hjälp mig köpa skärm!5
- Tips på portal hårddisk, 5TB0
- 3D skrivare - Diskussionstråden2,2k
- Säljes Intressekoll 1080ti, 2080ti samt Intel Core i7-14700K CPU
- Köpes Surfplatta köps
- Köpes Köper Intel ITX 1700 Moderkort + Contact frame
- Säljes Macbook Pro 16" M1 Pro 16GB/512GB
- Köpes 5070 Köpes
- Köpes Moderkort med minne för AMD Ryzen 7 1700
- Köpes Unifi Enterprise 24 PoE (Gen1)
- Säljes Asus TUF Gaming Gold 1000W 3.0 + Intressekoll Lian li a3 + Vertikalt GPU KIT
- Köpes Söker grafikkort
- Säljes Aeris Studio Killer65 65% Keyboard Kit (nyskick)
- Veckans fråga: Vad är viktigast när du väljer skärm?45
- Nytt världsrekord i CPU-frekvens10
- Stor offentlig leverantör hackad41
- Kampanj: SweClockers Hexagon XXL Musmatta (Slutsåld!)56
- Corsair lanserar Xeneon Edge – touchskärm på 14,5 tum12
- Resa: Hälften av platserna paxade till Expedition Taiwan20
- Intel visar upp Clearwater Forest - Xeon med 288 E-kärnor27
- Allvarlig sårbarhet i Docker för Windows9
- Aggressivare påminnelser om att uppgradera Windows 10130
- När Mega Man ersatte dansband – så föddes Moderskeppet3
Externa nyheter
Spelnyheter från FZ