Pregunta

Tengo una tabla de registro utilizado para el dispositivo “latidos del corazón”. Tengo estos dispositivos de red que el registro de entrada / latido del corazón con el servidor cada 10 minutos. Estamos queriendo estadísticas de cuando menos a su check-in hora programada. Tengo una consulta que puede hacer esto sobre una base por dispositivo, pero lo necesito para ser modificado para mango en todos los dispositivos.

La tabla de los latidos del corazón es similar al siguiente:

CREATE TABLE [dbo].[DeviceHeartbeat](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [DeviceId] [int] NULL,
    [CheckinTime] [datetime] NULL,
    [Runtime] [int] NULL,
PRIMARY KEY CLUSTERED 
([Id] ASC)) ON [PRIMARY]

dispositivo comprueba en el servidor, el servidor añade una fila de esta tabla con su ID, el CheckinTime y tiempo de ejecución del dispositivo (un valor hardware enviado por el dispositivo). La consulta que tengo actualmente es el siguiente:

WITH t AS
(
  SELECT Checkintime, rn = ROW_NUMBER() OVER (ORDER BY Checkintime)
  FROM DeviceHeartbeat
  WHERE DeviceId = 1112
),
x AS
(
  SELECT d = DATEDIFF(MINUTE, t1.Checkintime, t2.Checkintime)
  FROM t AS t1
  INNER JOIN t AS t2
  ON t1.rn = t2.rn - 1
),
y AS
(
  SELECT stats = CASE WHEN d < 10 THEN ' < 10 '
    WHEN d BETWEEN 10 AND 11 THEN '10 - 11 '
    WHEN d BETWEEN 11 AND 12 THEN '11 - 12 '
    ELSE '+12 ' END + ' minutes:'
  FROM x
)
SELECT stats, COUNT(*) FROM y GROUP BY stats;

Esta consulta está limitada a un único dispositivo especificado. Ejemplo de resultados se ven así:

stats                  
----------------- ---- 
 < 10  minutes:   1536
10 - 11  minutes: 425
11 - 12  minutes: 952
+12  minutes:     160

Lo ideal, sólo estoy preocupado con registros de entrada superior a 12 minutos. Por lo tanto, lo que yo quería era una lista de dispositivos que tienen registros de entrada superiores a 12 minutos, ordenados por su cuenta. Esto permitirá que vea la parte superior 10 o 20 dispositivos que tienen más de 12 minutos para la facturación en tiempos, alertándome a dispositivos con problemas. Algo así como:

DeviceId   CheckinsOver12Mins
---------- -------------------
1112       160
1108       152
15         114
106        86

Sugerencias?

¿Fue útil?

Solución

Prueba esto:

WITH t AS
(
  SELECT Checkintime, DeviceID, rn = ROW_NUMBER() OVER (ORDER BY DeviceID, Checkintime)
  FROM DeviceHeartbeat
),
x AS
(
  SELECT t1.deviceID, d = DATEDIFF(MINUTE, t1.Checkintime, t2.Checkintime)
  FROM t AS t1
  INNER JOIN t AS t2
  ON t1.rn = t2.rn - 1 and t1.DeviceID = t2.DeviceID
),
y AS
(
  SELECT deviceID
  FROM x
  WHERE d > 12
)
select deviceID, count(deviceID) as [Checkins over 12 mins] FROM y GROUP BY deviceID

Nota:. No tenemos datos de prueba - no lo hizo la prueba, podría tener errores tipográficos

Debe ser el CTE y podría ser retirado y cambiado a lo que es una consulta más pequeña:

select deviceID, count(deviceID) as [Checkins over 12 mins] 
FROM x 
GROUP BY deviceID
HAVING d > 12
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top