Si l'ajout d'une clé primaire n'est pas une option, une approche serait de stocker les doublons DISTINCT dans une table temporaire, de supprimer tous les enregistrements dupliqués de la table existante, puis de rajouter les enregistrements dans la table d'origine à partir de la table temporaire .
Par exemple (écrit pour SQL Server 2008, mais la technique est la même pour n'importe quelle base de données):
DECLARE @original AS TABLE([hash] varchar(20), [d] float)
INSERT INTO @original VALUES('A', 1)
INSERT INTO @original VALUES('A', 2)
INSERT INTO @original VALUES('A', 1)
INSERT INTO @original VALUES('B', 1)
INSERT INTO @original VALUES('C', 1)
INSERT INTO @original VALUES('C', 1)
DECLARE @temp AS TABLE([hash] varchar(20), [d] float)
INSERT INTO @temp
SELECT [hash], [d] FROM @original
GROUP BY [hash], [d]
HAVING COUNT(*) > 1
DELETE O
FROM @original O
JOIN @temp T ON T.[hash] = O.[hash] AND T.[d] = O.[d]
INSERT INTO @original
SELECT [hash], [d] FROM @temp
SELECT * FROM @original
Je ne sais pas si sqlite a une ROW_NUMBER()
fonction de type, mais si c'est le cas, vous pouvez également essayer certaines des approches répertoriées ici: Supprimer les enregistrements en double d'une table SQL sans clé primaire