J'ai une table qui a un ID, une valeur et une date. Il existe de nombreux ID, valeurs et dates dans ce tableau.
Des enregistrements sont insérés périodiquement dans ce tableau. L'ID restera toujours le même mais parfois la valeur changera.
Comment puis-je écrire une requête qui me donnera l'ID plus la dernière fois que la valeur a changé? Remarque: la valeur augmentera toujours.
À partir de ces exemples de données:
Create Table Taco
( Taco_ID int,
Taco_value int,
Taco_date datetime)
Insert INTO Taco
Values (1, 1, '2012-07-01 00:00:01'),
(1, 1, '2012-07-01 00:00:02'),
(1, 1, '2012-07-01 00:00:03'),
(1, 1, '2012-07-01 00:00:04'),
(1, 2, '2012-07-01 00:00:05'),
(1, 2, '2012-07-01 00:00:06'),
(1, 2, '2012-07-01 00:00:07'),
(1, 2, '2012-07-01 00:00:08')
Le résultat devrait être:
Taco_ID Taco_date
1 2012-07-01 00:00:05
(Parce que 00:05 était la dernière fois Taco_Value
changé.)
sql-server
sql-server-2008-r2
t-sql
SqlSandwiches
la source
la source
taco
n'a rien à voir avec la nourriture?Réponses:
Ces deux requêtes reposent sur l'hypothèse qui
Taco_value
augmente toujours avec le temps.Une alternative avec moins de folie de fonction de fenêtre:
Exemples chez SQLfiddle
Mise à jour
Pour ceux qui gardent une trace, il y avait une controverse sur ce qui se passerait si cela
Taco_value
pouvait se répéter. S'il peut passer de 1 à 2, puis revenir à 1 pour une donnée donnéeTaco_ID
, les requêtes ne fonctionneront pas. Voici une solution pour ce cas, même si ce n'est pas tout à fait la technique des lacunes et des îles que quelqu'un comme Itzik Ben-Gan peut imaginer, et même si elle n'est pas pertinente pour le scénario du PO - elle peut être pertinentes pour un futur lecteur. C'est un peu plus complexe, et j'ai également ajouté une variable supplémentaire - uneTaco_ID
qui n'en a jamais qu'uneTaco_value
.Si vous souhaitez inclure la première ligne d'un ID dont la valeur n'a pas changé du tout dans l'ensemble:
Si vous souhaitez exclure ces lignes, c'est un peu plus complexe, mais des modifications mineures restent:
Exemples SQLfiddle mis à jour
la source
value
réapparaît: FiddleFondamentalement, c'est la suggestion de @ Taryn "condensée" en un seul SELECT sans tables dérivées:
Remarque: cette solution prend en compte la stipulation qui
Taco_value
ne peut qu'augmenter. (Plus exactement, il suppose queTaco_value
ne peut pas revenir à une valeur précédente - identique à la réponse liée, en fait.)Une démo SQL Fiddle pour la requête: http://sqlfiddle.com/#!3/91368/2
la source
Vous devriez pouvoir utiliser les deux fonctions d'agrégation
min()
etmax()
obtenir le résultat:Voir SQL Fiddle avec démo
la source
Une autre réponse basée sur l'hypothèse que les valeurs ne réapparaissent pas (il s'agit essentiellement de la requête 2 d'Aaron, condensée dans un nid de moins):
Testez à: SQL-Fiddle
Et une réponse au problème plus général, où les valeurs peuvent réapparaître:
(ou en utilisant
CROSS APPLY
ainsi toute la ligne associée, y compris levalue
, est affichée):Testez à: SQL-Fiddle-2
la source
dbo.Taco UNION ALL SELECT DISTINCT Taco_ID, NULL AS Taco_value, '19000101' AS Taco_date
).FYI +1 pour fournir la structure et les données de l'échantillon. La seule chose que j'aurais pu demander est la sortie attendue pour ces données.
EDIT: Celui-ci allait me rendre fou. Je viens juste de savoir qu'il y avait un moyen "simple" de le faire. Je me suis débarrassé des solutions incorrectes et en ai mis une qui me semble correcte. Voici une solution similaire à @bluefeets mais elle couvre les tests que @AaronBertrand a donnés.
la source
value
changements.Pourquoi ne pas simplement obtenir la différence de la valeur de décalage et de la valeur de plomb? si la différence est nulle, elle n'a pas changé, elle est non nulle, alors elle a changé. Cela peut se faire dans une simple requête:
la source
lag...
fonction analytique n'a été introduite que "récemment" dans SQL Server 2012. La question d'origine demande une solution sur SQL Server 2008 R2. Votre solution ne fonctionnerait pas pour SQL Server 2008 R2.Cela pourrait-il être aussi simple que le suivant?
Étant donné que taco_value augmente toujours?
ps Je suis moi-même un débutant SQL, mais j'apprends lentement mais sûrement.
la source
Cannot perform an aggregate function on an expression containing an aggregate or a subquery