2009-09-11 8 views
1

Mon patron m'a confié une mission dont je ne suis pas sûr, car après environ deux semaines, je n'arrive pas à trouver une solution, alors je la lance pour demander n'importe quelle sorte de aide du groupe SO. Si cela vous casse le cerveau, je m'excuse. Un peu de contexte en premier: Nous développons une application d'interrogation de base de données qui permet aux utilisateurs de récupérer tout ce qu'ils veulent dans la base de données sans avoir à connaître de SQL.Comment redéfinir Distinct

Mon problème: Nous souhaitons personnaliser la façon dont une sélection «distincte» est utilisée. Au lieu d'appliquer le mot clé distinct aux lignes sélectionnées, nous souhaitons qu'il ne s'applique qu'à certains champs, afin que les premières lignes correspondant aux champs soient utilisées. Pour un exemple:

Bob Jones, 122 Main Street, Portland, OR
Sue Jones, 122 Main Street, Portland, OR
Mary Smith, 458 32nd Street, Portland, OR
Ralph Smith, 458 32nd Street , Portland, OR

nous voulons que cela fonctionne de sorte que seules les premières lignes pour chaque adresse est renvoyée comme suit:

Bob Jones, 122 Main Street, Portland, OR
Mary Smith, 458 32nd Street , Portland, ORAvec la normale distincte, les quatre lignes seraient retournées, ce qui est plus que ce que nous voulons. Est-ce que quelqu'un a des idées sur la façon dont nous pouvons y arriver? Merci.

Répondre

5
WITH NumberedRows AS (
    SELECT FirstName, LastName, Address, 
      ROW_NUMBER() OVER (PARTITION BY Address ORDER BY Id) as RowNumber 
    FROM Table 
) SELECT FirstName, LastName, Address 
    FROM NumberedRows 
    WHERE RowNumber = 1; 

PARTITION BY Address spécifie la liste des colonnes que vous voulez groupe par et ORDER BY ID indique la liste des colonnes que vous définissez l'élément « première » avec.

(Assurez-vous que la déclaration précédente est terminée par un point-virgule.)

+0

Cela fonctionne magnifiquement et notre DBA m'a demandé une copie du SQL pour quelques autres projets qu'elle a en cours. De plus, avec la façon dont notre programme est structuré, la mise en œuvre de ce devrait être une promenade de gâteau. –

3

Vous devez exécuter une instruction sql "SELECT DISTINCT" régulière qui interroge uniquement les champs qui doivent être distincts. Ensuite, une fois que vous les récupérez, exécutez une autre requête qui prend l'enregistrement TOP 1 qui a des données correspondantes pour obtenir les champs non distincts. Pour l'instant je ne vois pas un moyen de le faire dans une seule instruction SQL ...

3

SELECT MIN (a.firstname + a.lastname), adresse de x Groupe Par adresse.

C'est une réponse trop simpliste, mais vous obtenez votre point de vue. il renverra seulement le nom "moindre" pour chaque adresse distincte.

Vous aurez besoin d'utiliser la concaténation de champs pour faire les distinctions, mais cela vous donnera ce dont vous avez besoin.

+0

Cela fonctionne, oui, et je me souviens que j'avais qui souhaite avant je me suis cassé mon cerveau il y a quelques semaines. Le seul inconvénient est que j'ai besoin d'une réécriture modérée de plusieurs morceaux de code, et la réponse acceptée nécessite beaucoup moins d'une réécriture de notre système. –