3
votes

Comment stocker la conversion de datetime dans une nouvelle colonne avec un nouveau nom de colonne sur lequel il est possible d'utiliser ORDER BY?

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


1 commentaires

Pour supprimer les doublons, utilisez DISTINCT juste après le SELECT le plus à l'extérieur et avant la liste de colonnes.


5 Réponses :


2
votes

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 .


8 commentaires

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 .



4
votes

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.


0 commentaires

3
votes

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


2 commentaires

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



1
votes

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


0 commentaires

1
votes

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.


0 commentaires