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.
- C++ och dess framtid att programmera minnessäkert - Hur går utvecklingen?1,6k
- Vilken film såg du senast?15k
- Aggressivare påminnelser om att uppgradera Windows 1095
- Resa: Hälften av platserna paxade till Expedition Taiwan16
- Har fastnat i en tankeloop kring det här med NAS och behöver hjälp8
- Kampanj: SweClockers Hexagon XXL Musmatta (-40%)44
- Hur ofta vabbar ni?64
- Battlefield 61,2k
- Tips/rekommendationer mottages ny dator6
- Plats för lite gubbgnäll13k
- Säljes Asus GTX 1070 8GB OEM
- Säljes Modemodemspaket (Ryzen 5800x)
- Säljes yale Linus Family edition Smartlås.
- Köpes Söker Nr200p v1 kring Gbg
- Säljes Unifi Cloudkey Gen 2+, G3 Bullet-kameror + div PoE-prylar
- Säljes Oöppnad LG UltraGear 27GS95QE 27" OLED
- Säljes CPU, mobo, GPU, PSU, chassi
- Säljes Sapphire Pulse 6600XT säljes
- Säljes AMD R5 3600X + RX 5700 XT + 16GB DDR4 3600 MHz
- Säljes Gigabyte GeForce RTX 4060 Ti 8GB Windforce
- Kampanj: SweClockers Hexagon XXL Musmatta (-40%)44
- Corsair lanserar Xeneon Edge – touchskärm på 14,5 tum7
- Resa: Hälften av platserna paxade till Expedition Taiwan16
- Intel visar upp Clearwater Forest - Xeon med 288 E-kärnor23
- Allvarlig sårbarhet i Docker för Windows9
- Aggressivare påminnelser om att uppgradera Windows 1095
- När Mega Man ersatte dansband – så föddes Moderskeppet3
- Asrock hoppas stävja smältande kablar med temperatur-sensor61
- MSI satsar på hårdvaru-waifus32
- Snabbkoll: Har du blivit av med användarkonto?66
Externa nyheter
Spelnyheter från FZ