2010-01-12 6 views
1

J'ai un peu de puzzle SQL Distinct que je ne peux pas résoudre (ou du moins pas d'une manière très élégante).ordonné SQL Select columnwise distinct mais retour de toutes les colonnes

J'ai deux tables (essayez d'ignorer la simplicité de l'exemple). J'utilise MSSQL 2008 si cela fait beaucoup de différence.

Tableau: Catégorie

| categoryId (uniqueidentifier) PK | 
| Name varchar(50)     | 

Tableau: Télécharger

| downloadId (uniqueidentifier) PK | 
| categoryId (uniqueidentifier) FK | 
| url (varchar(max))    | 
| createdate (datetime)   | 

J'ai quelques catégories dans la table de catégorie et potentiellement beaucoup d'URL de téléchargement dans le tableau de téléchargement. Je suis intéressé à sélectionner le plus récent en utilisant l'URL de téléchargement créée (ou top 5 si cela est possible) pour chaque catégorie à partir du tableau de téléchargement.

Actuellement, je suis en train de faire ce qui suit, mais ce n'est pas très agréable, et peut difficilement être la bonne façon de le faire.

SELECT 
    categoryId, 
    max(convert(BINARY(16),downloadId)) as downloadId, 
    max(createdate) as createdate 
INTO tmp 
FROM Download 
GROUP BY categoryId 
ORDER BY createdate 

SELECT url 
FROM Download 
WHERE downloadId IN 
     (SELECT CONVERT(uniqueidentifier, downloadId) FROM tmp) 

DROP Table tmp 

Toutes les suggestions seraient très appréciées.

+0

montrent une entrée et sortie de l'échantillon ... vous obtiendrez rapidement une aide – CheeseConQueso

+0

aussi, il semble que vous n'êtes même pas utiliser le tableau de la catégorie dans votre code ... Pourquoi avez-vous mis en ici? – CheeseConQueso

Répondre

2

Pour obtenir les derniers téléchargements 5 vous devriez pouvoir:

SELECT categoryId, downloadId, createdate, url 
FROM (
    SELECT 
    categoryId, downloadId, createdate, url, 
    ROW_NUMBER() OVER(PARTITION BY categoryId ORDER BY createdate DESC) rownum 
    FROM Download 
) d 
WHERE d.rownum <= 5 
+0

Sauf pour l'erreur d'orthographe, c'est parfait. Je vous remercie! J'ai regardé dans un exemple similaire mais je pensais que ROW_NUMBER ne fonctionnait pas dans mssql - dommage pour moi. – sjkp

+0

cytegoryId devrait être categoryId, chose mineure les gens n'utilisent probablement pas les mêmes noms. – sjkp

+0

Merci, j'ai corrigé la faute de frappe. –

0

Je ne sais pas si cela serait utile à personne qui vient à travers ce ou s'il existe un moyen plus efficace de le faire mais je devais sélectionner les colonnes distinctes ordonnées par date de création et j'Infogérance en procédant comme suit:

SELECT DISTINCT categoryId, downloadId, url 
FROM ( 
    SELECT 
    categoryId, downloadId, createdate, url, 
    ROW_NUMBER() OVER(PARTITION BY categoryId ORDER BY createdate DESC) rownum 
    FROM Download 
) d 
WHERE d.rownum <= 5 

Fondamentalement ajouté DISTINCT et retiré CreateDate ...

S'il existe un moyen plus efficace de le faire, s'il vous plaît faites le moi savoir.

Merci,