commande par plusieurs colonnes
J'ai besoin de données de la commande par deux colonnes, Comment dois-je faire?
C'est ma table:
Name | ImpFile | ImpTime
Sam Imp01 2012-05-16 09:54:02.477
Ann Imp01 2012-05-16 09:54:02.478
Mark Imp01 2012-05-16 09:54:02.477
John Import12 2012-05-16 09:55:37.384
Bart Import12 2012-05-16 09:55:37.387
Sasha Import12 2012-05-16 09:55:37.385
J'ai besoin de trier ce tableau par ImpTime et ImpName et il devrait ressembler à ceci:
Name | ImpFile | ImpTime
Import12 2012-05-16 09:55:37.387
Bart Import12 2012-05-16 09:55:37.387
John Import12 2012-05-16 09:55:37.384
Sasha Import12 2012-05-16 09:55:37.385
Imp01 2012-05-16 09:54:02.478
Ann Imp01 2012-05-16 09:54:02.478
Mark Imp01 2012-05-16 09:54:02.477
Sam Imp01 2012-05-16 09:54:02.477
Je suis l'aide de cette requête, mais il n'est pas de l'ordre de la table par un Nom, seulement des ordres en votre nom lorsque le temps est à la même valeur pour plusieurs lignes.
select Name, ImpFile, ImpTime
from people
union
select distinct '', ImpFile, max(ImpTime)
from people
group by ImpFile
order by ImpTime desc, Name
Cette requête me donne un tableau comme ceci:
Name | ImpFile | ImpTime
Import12 2012-05-16 09:55:37.387
John Import12 2012-05-16 09:55:37.384
Bart Import12 2012-05-16 09:55:37.387
Sasha Import12 2012-05-16 09:55:37.385
Imp01 2012-05-16 09:54:02.478
Sam Imp01 2012-05-16 09:54:02.477
Ann Imp01 2012-05-16 09:54:02.478
Mark Imp01 2012-05-16 09:54:02.477
Est-il de toute façon à l'ordre par ces deux colonnes en même temps?
MODIFIER
Qu'advient-il lorsque j'utilise order by ImpFile DESC, ImpTime desc
?
Il me donne un résultat de la table comme ceci:
Name | ImpFile | ImpTime
Import12 2012-05-16 09:55:37.387
Imp01 2012-05-16 09:54:02.478
Bart Import12 2012-05-16 09:55:37.387
John Import12 2012-05-16 09:55:37.384
Sasha Import12 2012-05-16 09:55:37.385
Ann Imp01 2012-05-16 09:54:02.478
Mark Imp01 2012-05-16 09:54:02.477
Sam Imp01 2012-05-16 09:54:02.477
"Est-il possible de commander par ces deux colonnes en même temps?" Vous êtes déjà commander par deux colonnes en même temps, alors, quelle est votre question? Le temps est la priorité car c'est la première colonne que vous souhaitez commander. Le
Est-il un moyen de définir la priorité pour les deux colonnes de la même?
pourquoi tu fais un syndicat?
pour ajouter une ligne seulement avec impfile date et sans nom
"Si stockées en datetime, 2012-05-16 09:55:37.385 se transforme en 2012-05-16 09:55:37.384" Hmm.. pourquoi vous n'avez pas inclure cette particularité dans votre question, si les deux d'entre eux sont stockées en 384, comment sur terre ne peut stackoverfellows sait que nous sommes de la formulation d'une requête sur les données correctes? Votre requête est déjà correct si la cohérence des données(385 est stocké comme 385, et 384 est stocké en tant que 384; mais vous n'avez pas parlé rapidement il y a des données particularité; 385 précision est perdu avec datetime, de sorte qu'il est stocké vraiment que 384) a été maintenue
Name
ne sera prise en compte sur les enregistrements avec le même ImpTime
.Est-il un moyen de définir la priorité pour les deux colonnes de la même?
pourquoi tu fais un syndicat?
pour ajouter une ligne seulement avec impfile date et sans nom
"Si stockées en datetime, 2012-05-16 09:55:37.385 se transforme en 2012-05-16 09:55:37.384" Hmm.. pourquoi vous n'avez pas inclure cette particularité dans votre question, si les deux d'entre eux sont stockées en 384, comment sur terre ne peut stackoverfellows sait que nous sommes de la formulation d'une requête sur les données correctes? Votre requête est déjà correct si la cohérence des données(385 est stocké comme 385, et 384 est stocké en tant que 384; mais vous n'avez pas parlé rapidement il y a des données particularité; 385 précision est perdu avec datetime, de sorte qu'il est stocké vraiment que 384) a été maintenue
OriginalL'auteur Brezhnews | 2012-05-16
Vous devez vous connecter pour publier un commentaire.
Obtenir le leader de chaque groupe et de les trier par ordre décroissant d'heure:
De sortie:
Puis rejoindre les adeptes de leader et d'obtenir le leader du moment(TimeGroup):
De sortie:
La logique de la requête est, nous alignons les disciples(ceux avec le nom de la personne) temps de leur chef de l'époque(TimeGroup) basé sur ImpFile. Chef de file et ses adeptes ont le même temps de groupe, de sorte que lorsque nous les trier par moment, elles se collent les unes aux autres; puis, après que, nous, les trier par nom
Test en direct: http://www.sqlfiddle.com/#!3/c7859/21
Si nous voulons que le chef de groupe à apparaître après ses adeptes, il suffit de mettre un arrêt à la COMMANDE PAR:
De sortie:
Test en direct: http://www.sqlfiddle.com/#!3/c7859/23
Comment cela fonctionne:
De sortie:
Test en direct: http://www.sqlfiddle.com/#!3/c7859/25
+1 pour le partage du lien de SQL Violon! C'est un outil cool!
OriginalL'auteur Michael Buen
Pourquoi vous ne pouvez pas juste faire comme ceci:
Non, il ne résulte pas de ce que vous montrez. Il à de ce:
Voir ici pour un exemple
MODIFIER
J'ai une suggestion pour vous. Peut-être quelque chose comme ceci:
Des données de Test
Requête
ce n'est qu'une partie de mon tableau, peut-être que ceux-ci donnent le résultat de ce genre, mais il y a des enregistrements, où le résultat est ce que j'ai montré
Si vous ne sécurisez pas cet ordre, il ne peut être garanti. Vous devez le spécifier dans votre
ORDER BY
explicitement que tous les agrégés ligne doit aller au début de son groupe respectif. L'OP est à droite, la sortie dans votre exemple simple passe à celui qui est requis. Avec un plus grand ensemble de données, il peut être différent.Ok. Mise à jour de la réponse ont un coup d'oeil.
Ce doit être plus proche, mais elle ne garantit pas que les lignes de résumé (ceux avec vide Noms) permettrait d'aller de l'avant leurs respectifs des lignes de détails. Vous pourriez obtenir
(empty name)
, puisBart
, ou tout simplement dans l'autre sens. Je pense que vous pourriez avoir besoin d'une colonne supplémentaire pour afficher les lignes qui sont des détails, et qui sont le résumé (et l'utilisation de cette colonne dans le tri, en quelque sorte).OriginalL'auteur Arion
Tout d'abord, vous devez réaliser qu'avec la
datetime
type de granularité, SQL Server est incapable de distinguer entre2012-05-16 09:55:37.384
et2012-05-16 09:55:37.385
: les deux devraient être stockées en tant que2012-05-16 09:55:37.384
.Gardant cela à l'esprit et en supposant que vous souhaitez classer les groupes par
MAX(ImpTime) DESC
ainsi que le détail des lignesImpTime DESC
, vous pouvez essayer quelque chose comme ceci:Lors de l'exécution sur SQL Violon, ce qui produit la sortie suivante pour votre exemple:
Et remarque que j'ai défini temporairement
ImpTime
comme unvarchar
, non pas comme undatetime
, juste pour le plaisir d'une meilleure démonstration, parce que, comme je l'ai dit,datetime
's granularité aurait pour résultat légèrement différentes valeurs stockées (et, par conséquent, légèrement différente de la production).OriginalL'auteur Andriy M
Vous voulez probablement pour frotter les millisecondes: http://www.sqlfiddle.com/#!3/35065/2
De sortie:
Technique pour l'épuration de l'millisecondes source ici: SQL Server supprimer millisecondes de datetime
Si vous souhaitez conserver et de montrer l'origine du temps, il suffit de faire ceci: http://www.sqlfiddle.com/#!3/35065/1
Je pense que SqlFiddle ne pas afficher les millisecondes. S'il vous plaît essayer la deuxième requête sur votre Serveur Sql, je suis actuellement sur d'autres OS maintenant, je ne vois pas la deuxième requête de sortie réelle
Voici la sortie de la seconde requête, avec datetime intacte, testé sur SSMS:
Jetez un oeil à ma sortie, il adhère à la sortie souhaitée. Vérifier que le test en direct ici: sqlfiddle.com/#!3/35065/1
sqlfiddle.com/#!3/35065/1 à la suite où ImpFile est "Import12" John devrait venir avant de Sasha, parce qu'à l'alphabet "J" vient avant "S"
Pourtant, votre exigence est de trier par ordre décroissant dans le temps, n'est-ce pas? Comment peut John venir avant de Sasha? regarder vos données: Bart(.387), Jean(.384), Sasha(.385). Si nous avons en quelque sorte que par ordre décroissant d'heure: Bart(.387), Sasha(.385), Jean(.384) Comment peut-Jean-être d'abord que Sasha, si la première partie de votre exigence est de les trier par ordre décroissant du temps(et de les trier par nom) ?
eh bien, c'est le moment, j'ai besoin que la première requête où il obtient seulement ImpFile et ImpTime est triée par ImpTime à la descente, mais la requête où je reçois également les Noms sont triés par Nom. peut-être il ya un moyen de le faire? Pour chaque requête union séparément
OriginalL'auteur Michael Buen
Il ressemble à la
order by
est seulement appliqué à la deuxièmeselect
dans votreunion
requête.Essayez d'utiliser un
subselect
de créer une table temporaire pour appliquer laorder by
:C'est le même que l'OP de la requête. COMMANDE PAR l'UNION s'applique à l'ensemble de la requête, et pas seulement la dernière requête. Donc la parenthèse dans votre requête est superflu
Regardez les deux requêtes ici: sqlfiddle.com/#!3/22aeb/2 Elles sont à la fois un comportement identique
OriginalL'auteur Dan Cruz
Vous pouvez obtenir le résultat souhaité avec commande par ImpFile desc,Nom
Voici la sortie
OriginalL'auteur bvr