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.
- MSI: 533 dagar senare - knappt någon OLED-inbränning93
- Quiz: Vad kan du om gamingskärmar?59
- CAD Dator 7k0
- Rabbel.se - Ett dagligt ordspel2,5k
- Tv4 försvinner från marknätet vid årsskiftet.12
- C++ och dess framtid att programmera minnessäkert - Hur går utvecklingen?1,6k
- Nokia MikroMikko x Framework10
- Wordle på svenska - ordlig.se9,4k
- Piranha Base gamingbord samt skärmstativ0
- Budgetbygge5
- Köpes Sökes: Raijintek Morpheus 8069
- Säljes Powerful gaming machine
- Köpes Intel m-atx, LGA 1700, DDR4, Lan 2.5gbit.
- Bytes LGA1700 mot AM5
- Köpes Logitech Z-906 styrenhet
- 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
- Sapphires moderkort närmar sig lansering16
- Quiz: Vad kan du om gamingskärmar?59
- MSI: 533 dagar senare - knappt någon OLED-inbränning93
- Intels Nova Lake-S nära färdigställda29
- Bättre stöd för Bluetooth-headset i Windows 1140
- AMD Ryzen Threadripper 9980X & 9970X – bäst i klassen19
- 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-frekvens21
Externa nyheter
Spelnyheter från FZ
- FZ High Score-säsongen i mål – Vi har en... nej, två vinnare igår
- Bethesda antyder riktiga rymdresor i Starfield igår
- Diskutera – Tidernas bästa co-op-spel är... igår
- Gears of War: Reloaded sågas på Steam – försvunnet split-screen och krascher igår
- Det episka quizzet – Unreal! Gears of War! Fortnite! igår