Consulta agregada que devuelve varios registros

Tengo la siguiente tabla (simplificado):

RecordID       bigint         IDENTITY
ItemID         bigint
ConfigID       varchar
Status         varchar
StatusDate     date

Data de muestra:

001  04  1E  10    2007-08-14 13:57:54
002  04  1E  12    2007-08-21 16:10:21
003  04  1D  10    2007-09-27 17:14:13
004  04  1D  43    2011-01-10 13:44:50
005  04  1B  50    2008-06-20 09:09:51
006  05  1A  17    2007-12-18 14:04:56
007  05  1A  11    2007-10-17 08:23:52
008  05  1A  12    2007-10-19 12:54:18
009  05  1B  12    2007-11-02 09:23:54
010  05  1B  40    2010-06-17 09:34:33
011  07  1A  12    2007-11-19 14:48:06
012  07  1A  12    2007-11-19 15:02:48
013  07  1B  40    2011-01-10 14:36:16
014  08  1B  10    2009-05-22 11:14:42
015  08  1B  12    2007-11-20 17:02:44
016  08  1A  12    2007-12-12 16:11:57
017  08  1A  10    2009-11-12 11:12:45
018  08  1C  35    2011-01-10 18:30:10
019  08  1D  12    2009-10-14 14:34:47
020  08  1D  10    2009-10-14 14:35:09

Aquí radica mi problema:

Necesito poder hacer que los usuarios finales consulten estos datos para devolver registros que muestren el estado y la fecha de estado más recientes para cada combinación única de itemid y config. Entonces, usando la muestra anterior, quiero devolver un conjunto de registros que coincida con lo siguiente:

002  04  1E  12    2007-08-21 16:10:21
004  04  1D  43    2011-01-10 13:44:50
005  04  1B  50    2008-06-20 09:09:51
006  05  1A  17    2007-12-18 14:04:56
010  05  1B  40    2010-06-17 09:34:33
012  07  1A  12    2007-11-19 15:02:48
013  07  1B  40    2011-01-10 14:36:16
017  08  1A  10    2009-11-12 11:12:45
018  08  1C  35    2011-01-10 18:30:10
020  08  1D  10    2009-10-14 14:35:09

En lenguaje sencillo: necesito poder devolver el estado y la fecha de estado más recientes para la(s) configuración(es) de cada elemento.

Cualquier ayuda en este sentido sería muy apreciada. Gracias de antemano.

preguntado el 30 de agosto de 12 a las 16:08

3 Respuestas

Puedes hacer el GROUP BY cláusula en una subconsulta. Tratar,

SELECT  a.*
FROM    yourtable a 
        INNER JOIN
        (
            SELECT      ItemID, ConfigID, MAX([StatusDate]) maxStat
            FROM        yourtable
            GROUP BY    ItemID,ConfigID
        ) b on a.configID = b.configID AND
                a.[statusDate] = b.MaxStat AND
                a.ItemID = b.ItemID
Order by RecordID

Demostración de SQLFiddle

Respondido 30 ago 12, 17:08

Creo que tiene dos problemas, necesita itemID + configID como condición groupBy. ¿Y si tienes el estado dos veces por lo mismo? Entonces obtendrá esa fila dos veces en lugar de una. Ejemplo dos: 04 1B 50, 04 1B 50 con fechas diferentes. - András Otto

las columnas de estado deben cambiarse a StatusDate para obtener la más reciente, en lugar del "Estado" máximo - Tobsey

Perdón por la confusión. Necesito devolver el registro (fila) de la configuración de cada elemento examinando la fecha de estado máxima de las configuraciones de cada elemento. ¿Tiene eso algún sentido? - Tenga

@Oso por qué es 014 08 1B 10 2009-05-22 11:14:42 no está incluido en el resultado deseado? es un error tipográfico? - John Woo

Sí, lo es... o una prueba para ver si estabas prestando atención, sí, vamos con eso. ¡Gracias por la captura! - Tenga

en el servidor SQL 2005+, puede usar CTE para esto:

;with cte as
(
  select recordid,
    itemid,
    configid,
    status,
    statusdate,
    row_number() over(partition by itemid, configid
                        order by statusdate desc) rn
  from yourtable
)
select *
from cte
where rn = 1
order by recordid

ver Violín SQL con demostración

Respondido 30 ago 12, 17:08

¡Esto funciona de maravilla! consigo algo menor de edad inclusiones escamosas, pero no se basa únicamente en esta consulta, se trata de otros parámetros entrantes que no se enumeran aquí. yo aceptar este de todo corazón! - Tenga

Bluefeet, ¡tenía que volver y darte muchas gracias por este fragmento! Si alguna vez se encuentra en el área del norte de Virginia, hágamelo saber, el almuerzo corre por mi cuenta. - Tenga

@Bear si alguna de las respuestas funciona, asegúrese de aceptarla para que los futuros visitantes sepan la respuesta. No se necesita almuerzo, estoy feliz de ayudar. :) - Taryn

SELECT
    RecordID,
    ItemID,
    ConfigID,
    Status,
    StatusDate
FROM
    (SELECT
        RecordID,
        ItemID,
        ConfigID,
        Status,
        StatusDate,
        ROW_NUMBER() OVER(PARTITION BY ItemId,ConfigID ORDER BY StatusDate DESC) As StatusOrder
    FROM
        MyTable) Statuses
WHERE
    StatusOrder= 1

Respondido 30 ago 12, 17:08

Me gusta esta respuesta también. ¡Gracias por tu tiempo! - Tenga

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.