J'ai une colonne datetime et je souhaite supprimer les "DATES" en double de cette colonne.
Le type de données de ma colonne existante est datetimeoffset (7):
select newcolumn from( (SELECT CONVERT(VARCHAR(10), mytimestamp_column, 102) FROM [dbo].[myTable] where mycondition = 1223445) as newcolumn order by newcolumn desc
Je suis maintenant en mesure d'extraire les dates comme ceci:
(No column name) 2018.06.18 2018.06.17 2018.06.16 .... and so on
5 Réponses :
Vous pouvez essayer ceci en utilisant Row_Number comme indiqué ci-dessous.
DELETE A FROM(
SELECT
Row_Number() Over(Partition By mytimestamp_column Order By
mytimestamp_column) as RN, CONVERT(VARCHAR(10), mytimestamp_column, 102) as
NewColumn
FROM [dbo].[myTable]
--where mycondition = 1223445) as newcolumn
)A where RN > 1
Vous pouvez trouver la démo Ici .
J'obtiens un nom de colonne incorrect pour celui-ci.
@otk Veuillez consulter la démo.
Il s'agit donc de supprimer uniquement les données dans une colonne «A»? Je dois supprimer toutes les lignes de ma table d'origine dont RN> 1.
@otk Cela supprimera toutes les colonnes de la table originale que vous pouvez vérifier en créant également une autre colonne. Veuillez consulter cette démo rextester.com/WZNZJ75855
Salut, ouais, je regarde la démo. Et cela fonctionne, mais quand je l'exécute dans mon environnement, il signale un nom de colonne invalide «A». Que représente A dans ce cas (une colonne réelle?)?
Et en plus, j'utilise pour l'instant SELECT au lieu de DELETE car je dois vérifier ce que je supprime. Mais je ne vois pas que cela devrait faire une différence?
@otk Ici, A est le nom de la table. Comme vous pouvez le voir, aucune colonne du nom A ne figure dans le tableau.
Continuons cette discussion dans le chat .
Il suffit de trier directement par quantité / colonne ou alias:
SELECT
CONVERT(VARCHAR(10), mytimestamp_column, 102) AS col
FROM [dbo].[myTable]
WHERE mycondition = 1223445
ORDER BY
col DESC;
Vous n'avez pas vraiment besoin de sous-requête ici.
dans votre requête newcolumn est un alias de table (sous-requête) pas d'alias de colonne, vous devez écrire votre requête ci-dessous de manière
select * from ( (SELECT CONVERT(VARCHAR(10), mytimestamp_column, 102) as col -- column alias FROM [dbo].[myTable] where mycondition = 1223445 ) as newcolumn --subquery name order by col desc
Pourquoi une sous-requête est-elle nécessaire ici?
@TimBiegeleisen il n'y a pas besoin de sous-requête, je viens de mentionner ce qu'il fait concernant son point d'erreur car vous avez déjà répondu à la requête sans sous-requête, c'est pourquoi je n'ai pas ajouté cette partie dans ma réponse
Utilisez l'expression de table commune pour créer une table comme un schéma et l'utiliser pour une requête ultérieure.
GO ;WITH CTE AS ( SELECT Row_Number() Over(Partition By mytimestamp_column Order By mytimestamp_column) as Slno, CONVERT(VARCHAR(10), mytimestamp_column, 102) as newcolumn FROM [dbo].[myTable] where mycondition = 1223445) Select * from cte where Slno>1 order by newcolumn desc GO
Il suffit de convertir la valeur en une date pour extraire la date:
select newcolumn
from (select t.*,
convert(date, mytimestamp_column) as mydate,
row_number() over (partition by convert(date, mytimestamp_column) order by mytimestamp_column) as seqnum
from t
where mycondition = 1223445
)
where seqnum = 1;
Comme dans:
order by convert(date, mytimestamp_column)
Pour supprimer les doublons de jeu de résultats , utilisez les fonctions de la fenêtre:
convert(date, mytimestamp_column)
N'utilisez delete que si vous souhaitez supprimer des lignes définitivement em> à partir de tableaux.
Pour supprimer les doublons, utilisez DISTINCT juste après le SELECT le plus à l'extérieur et avant la liste de colonnes.