J'ai des données dans une table qui ressemble à peu près aux éléments suivants: ni ticlid ni horodatage n'est unique, mais la combinaison de ticlid et d'horodatage est censée être unique. P> J'ai des données en double dans ma table et je tente de le supprimer. Cependant, j'arrive à la conclusion qu'il n'y a pas assez d'informations avec les données données pour que je disever une rangée de l'autre, et essentiellement aucun moyen de supprimer une seule des lignes en double. Je suppose que je devrais introduire une sorte de colonne d'identité qui m'aiderait à identifier une ligne de l'autre. P> est-ce correct, ou y a-t-il une manière magique de supprimer une seule mais pas à la fois des données en double avec une requête? p>
3 Réponses :
Supprimer de temp_table (ce dont vous n'avez pas besoin) P> Sélectionnez Distinct * dans TEMP_TABLE à partir de Source_Table CODE> (Ce tableau vous sera créé pour vous) insert into sorce_table
select * from temp_table
Peut-être que je ne comprends pas votre question correctement, mais si "tickid" et "horodatamp" sont garantis être uniques, alors comment avez-vous des données en double dans votre table? Pourriez-vous fournir un exemple ou deux de ce que vous voulez dire?
Toutefois, si vous avez des duplicats des trois colonnes à l'intérieur de la table, le script suivant peut fonctionner. Veuillez tester cela et faire une sauvegarde de la base de données avant de la mettre en œuvre car je viens de le mettre ensemble. P>
Désolé pour ça, je voulais dire qu'il "devrait être" unique, mais ce n'est pas (à cause des données en double). Je vais mettre à jour la question.
Voici une requête qui élimine les doublons et laissera exactement une copie de chaque ligne unique. Il fonctionnera avec SQL Server 2005 ou supérieur:
WITH Dups AS
(
SELECT tickId, timestamp, price,
ROW_NUMBER() OVER(PARTITION BY tickid, timestamp ORDER BY (SELECT 0)) AS rn
FROM stockData
)
DELETE FROM Dups WHERE rn > 1
Wow, je n'ai jamais rien vu de comme ça avant, mais ça a fière allure. Je vais lire dessus et faire des tests, merci!
Belle réponse d'une première minuterie :) Bienvenue sur Stackoverflow.
Juste une idée, je ne sais pas si cela fonctionne ou si cela supprimera les deux: Supprimer de Stackdata le cas échéant (sélectionnez Couchid à partir de Stackdata);
De SQL Server 2005, il existe une manière magique de supprimer un seul des doublons. Quelle version de SQL Server utilisez-vous? Après avoir corrigé le problème dupliqué, vous devez ajouter une contrainte de clé primaire à votre table.
Merci Mikael, j'utilise SQL Server 2005. J'ai eu une contrainte unique, mais j'ai consolidé des données de plusieurs tables en une seule table, et ces tableaux avaient des données en double. Je pensais que le moyen le plus simple consistait à tout jeter en une seule table, supprimez les dupes, puis ajoutez la contrainte après.
La "requête magique" est fournie par Sergey.