Tengo una tabla que tiene una ID, un valor y una fecha. Hay muchas ID, valores y fechas en esta tabla.
Los registros se insertan en esta tabla periódicamente. La ID siempre se mantendrá igual pero ocasionalmente el valor cambiará.
¿Cómo puedo escribir una consulta que me proporcione la identificación más la última vez que el valor ha cambiado? Nota: el valor siempre aumentará.
De esta muestra de datos:
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')
El resultado debería ser:
Taco_ID Taco_date
1 2012-07-01 00:00:05
(Porque 00:05 fue la última vez que Taco_Value
cambió).
sql-server
sql-server-2008-r2
t-sql
SqlSandwiches
fuente
fuente
taco
no tiene nada que ver con la comida?Respuestas:
Estas dos consultas se basan en la suposición de que
Taco_value
siempre aumenta con el tiempo.Una alternativa con menos locura de función de ventana:
Ejemplos en SQLfiddle
Actualizar
Para aquellos que siguen la pista, hubo una disputa sobre lo que sucede si
Taco_value
alguna vez pudiera repetirse. Si pudiera pasar de 1 a 2 y luego volver a 1 para cualquieraTaco_ID
, las consultas no funcionarán. Aquí hay una solución para ese caso, incluso si no es la técnica de brechas e islas que alguien como Itzik Ben-Gan puede soñar, e incluso si no es relevante para el escenario del OP, puede ser relevante para un futuro lector. Es un poco más complejo, y también agregué una variable adicional, unaTaco_ID
que solo tiene unaTaco_value
.Si desea incluir la primera fila para cualquier ID donde el valor no cambió en absoluto en todo el conjunto:
Si desea excluir esas filas, es un poco más complejo, pero aún cambios menores:
Ejemplos actualizados de SQLfiddle
fuente
value
reaparece: FiddleBásicamente, esta es la sugerencia de @Taryn "condensada" en un solo SELECCIONAR sin tablas derivadas:
Nota: esta solución tiene en cuenta la estipulación que
Taco_value
solo puede aumentar. (Más exactamente, se supone queTaco_value
no puede volver a un valor anterior, de hecho, igual que la respuesta vinculada).Una demostración de SQL Fiddle para la consulta: http://sqlfiddle.com/#!3/91368/2
fuente
Debe poder usar ambas
min()
ymax()
las funciones agregadas obtienen el resultado:Ver SQL Fiddle con Demo
fuente
Una respuesta más que se basa en la suposición de que los valores no vuelven a aparecer (esto es básicamente la consulta 2 de @ Aaron, condensada en un nido menos):
Prueba en: SQL-Fiddle
Y una respuesta al problema más general, donde los valores pueden reaparecer:
(o usando
CROSS APPLY
asívalue
se muestra toda la fila relacionada, incluida la ):Prueba en: SQL-Fiddle-2
fuente
dbo.Taco UNION ALL SELECT DISTINCT Taco_ID, NULL AS Taco_value, '19000101' AS Taco_date
).FYI +1 para proporcionar estructura de muestra y datos. Lo único que podría haber pedido es la salida esperada para esos datos.
EDITAR: Este me iba a volver loco. Acabo de saber que había una forma "simple" de hacer esto. Me deshice de las soluciones incorrectas y puse una que creo que es correcta. Aquí hay una solución similar a @bluefeets pero cubre las pruebas que dio @AaronBertrand.
fuente
value
cambian los cambios.¿Por qué no solo obtener la diferencia del valor de retraso y el valor de plomo? si la diferencia es cero, no cambió, si no es cero, cambió. Esto se puede hacer en una consulta simple:
fuente
lag...
función analítica se introdujo "recientemente" en SQL Server 2012. La pregunta original es pedir una solución en SQL Server 2008 R2. Su solución no funcionaría para SQL Server 2008 R2.¿Podría ser esto tan simple como lo siguiente?
Dado que taco_value siempre aumenta?
PD: Yo mismo soy bastante principiante en SQL, sin embargo, estoy aprendiendo lenta pero seguramente.
fuente
Cannot perform an aggregate function on an expression containing an aggregate or a subquery