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.
- Bilden dör efter 10 sek?4
- Stor Steam-uppdatering ger efterlängtade funktioner12
- Spotify lanserar lossless-ljud - men drömläget kräver kabel168
- Dagens fynd — Diskussionstråden55k
- MK under 2000kr = Asus TUF Gaming B850-Plus WiFi?13
- Vad lyssnar du på just nu?16k
- Övriga fynd (bara tips, ingen diskussion) — Läs första inlägget först!1,6k
- Telia IP-range för CGNAT (10.0.0.0/8) ?1
- Hur startar jag om min LG tv?12
- SSD-mysteriet löst – fel basmjukvara bakom76
- Säljes ZOWIE by BenQ XL2546X+ 24.1″ Fast TN 280Hz DyAc
- Säljes Garderobsrensning
- Säljes Fractal Design North Vit Mesh
- Säljes RTX 2080 AORUS 8GB – Gamingkraft nära RTX 3060 Ti!
- Köpes Nvidia gpu sökes. Max längd 230mm
- Köpes Gamingdator 5000kr
- Säljes PS5 digital edition 1TB - Oanvänd
- Köpes Shackdator
- Säljes Ducky Shine 7 RGB + Steelseries Arctis Nova 7 Wireless
- Säljes Steelseries Arctis 9 och 2 st Msi G2712 skärm
- Stor Steam-uppdatering ger efterlängtade funktioner12
- Quiz: Battlefield – Briljera och vinn plats i Slaget60
- Nu är det gratis att publicera i Microsoft-butiken12
- RTX 50 Super-modeller dröjer26
- Teenage Engineering Computer-2: Tekniskt sett ett chassi21
- Träpanel och USB-C när Asus lanserar ProArt RTX 508018
- Spotify lanserar lossless-ljud - men drömläget kräver kabel168
- Veckans fråga: Vad kostade din musmatta?108
- Intel bekräftar tidsplan för kommande processorer9
- Google: Den öppna webben i snabbt förfall9
Externa nyheter
Spelnyheter från FZ