47 votes

Obtenez le premier premier enregistrement à partir d'enregistrements en double sans identité unique

J'ai besoin de récupérer le dessus de la première ligne de chaque copie de l'ensemble des enregistrements de la table donnée ci-dessous. - Je besoin pour utiliser cette requête en vue

s'il vous plaît pas de table temp comme je l'ai déjà fait par l'ajout de la colonne d'identité et fonction min et group by. J'ai besoin de solution sans la table temporaire ou une variable de table

C'est juste des exemples de données. D'origine a 1000s d'enregistrements dans la table et j'ai besoin juste de haut 1000 ne peut donc pas utiliser distinctes

Je suis à l'aide de SQL Server 2005

alt text

Merci.

15voto

HGM Points 320

Trouver tous les produits qui ont été commandés 1 fois ou plus ... (type de doublons)

 SELECT DISTINCT * from [order_items] where productid in 
(SELECT productid 
  FROM [order_items]
  group by productid 
  having COUNT(*)>0)
order by productid 
 

Pour sélectionner le dernier inséré de ceux-ci ...

 SELECT DISTINCT productid, MAX(id) OVER (PARTITION BY productid) AS LastRowId from [order_items] where productid in 
(SELECT productid 
  FROM [order_items]
  group by productid 
  having COUNT(*)>0)
order by productid 
 

13voto

Aaronaught Points 73049

La réponse dépend précisément ce que vous entendez par le "top 1000" distincts des dossiers.

Si vous voulez dire que vous voulez retourner au plus de 1000 enregistrements distincts, indépendamment de la façon dont de nombreux doublons sont dans le tableau, puis écrire ceci:

SELECT DISTINCT TOP 1000 id, uname, tel
FROM Users
ORDER BY <sort_columns>

Si vous voulez seulement de rechercher les 1000 premières lignes dans la table, et peut-être retourner à beaucoup moins de 1000 lignes distinctes, puis vous l'écrire avec une sous-requête ou CTE, comme ceci:

SELECT DISTINCT *
FROM
(
    SELECT TOP 1000 id, uname, tel
    FROM Users
    ORDER BY <sort_columns>
) u

L' ORDER BY est bien sûr facultatif si vous n'avez pas de soins sur les enregistrements de retour.

13voto

Mário Meyrelles Points 198

Parfois, vous pouvez utiliser l'opérateur CROSS APPLY comme ceci:

 select distinct result.* from data d
cross apply (select top 1 * from data where data.Id = d.Id) result
 

Dans cette requête, je dois sélectionner uniquement le premier des nombreux doublons qui se produisent naturellement dans mes données. Il fonctionne sur les bases de données SQL Server 2005+.

1voto

Nikos Steiakakis Points 2651

SELECT DISTINCT n'aide-t-il pas? Je suppose que cela retournerait le résultat souhaité.

1voto

AdaTheDev Points 53358

L'utilisation de DISTINCT devrait le faire:

 SELECT DISTINCT id, uname, tel
FROM YourTable
 

Bien que vous puissiez vraiment faire avec une clé primaire sur cette table, un moyen d'identifier de manière unique chaque enregistrement. J'envisagerais de coller une colonne IDENTITY sur la table

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X