[tsql] distinct(col1), eerstewaarde(col2)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 12-06 21:01
Hey pro's, ik heb een tabel met rijen emails die opgeslagen zijn op de harddisk als .msg bestanden. Sommige van deze emails zijn gelijk, en ik heb een column MD5 om de dubbelen er uit te filteren. Nu hoef ik van al die gelijke emails maar één verwijzing te hebben naar een bestand op de harddisk, dus ik zat te denken aan de eerste de beste waarde die hij tegen komt, maar 't mag ook een random waarde zijn.

Dus zoiets:

Tabel: ID - MD5 - Sent - Location - Subject

Query:
code:
1
2
SELECT DISTINCT [md5] , [sent], first_value([location]), [subject]
FROM @temp


Wat ik zelf vond online:
http://dbaspot.com/forums...ehaviour.html#post1061689

Ik heb dat voorbeeld omgezet naar mijn eigen tabel, het lijkt te werken, maar ik heb geen idee wat het doet. Kan iemand iets uitleggen?
code:
1
2
3
4
5
6
7
8
    WITH QueryB AS (
    SELECT [md5], [sent], [location], [subject],
    rn = row_number() OVER (PARTITION BY md5 ORDER BY sent)
    FROM @temp
    )
    SELECT [md5], [sent], [location], [subject]
    FROM QueryB
    WHERE rn = 1

Acties:
  • 0 Henk 'm!

  • freak-ish
  • Registratie: December 2008
  • Laatst online: 15-01 17:16
Kweerie :) 1 maakt een rownummer aan, beginnend bij 1 en opnieuw beginnend indien [sent] veranderd
Kweerie :) 2 selecteerd de records van 1 waar rownum = 1

Acties:
  • 0 Henk 'm!

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 12-06 21:01
ik had gehoopt op wat diepere info over OVER en PARTITION, want ik vond de MSDN niet erg duidelijk :(

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Gewoon een group by met een MIN of MAX lijkt mij?
SQL:
1
2
3
SELECT [md5] , [sent], MIN([location]), [subject]
FROM @temp
GROUP BY [md5], [sent], [subject]

[ Voor 56% gewijzigd door Woy op 25-03-2010 16:47 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
OVER en PARTITION zijn niet MS-specifiek. Zoek eens op analytical functions en je vindt bergen interessante informatie (met name ORACLE documentatie, maar dat maakt in dit geval niets uit)

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Y3PP3R schreef op donderdag 25 maart 2010 @ 16:36:
ik had gehoopt op wat diepere info over OVER en PARTITION, want ik vond de MSDN niet erg duidelijk :(
De WITH-constructie levert je effectief een nieuwe tabel op (zoals elke query in SQL). En uit die tabel vis je dan de records met rownumber 1. Het is basically hetzelfde als een subselect in de from-clause in deze situatie.

De query in de WITH-constructie partitioneert je records per unieke md5. En je maakt dus effectief deelverzamelingen van je hele dataset op basis van die md5's om daar de rownumber-teller steeds bij opnieuw te beginnen.

Ik vond zelf de voorbeelden bij PostgreSQL wel duidelijk en with-queries.
Pagina: 1