2015-11-27 4 views
1

У меня есть следующие SQL таблицы:Измерение два массива для равенства низких чисел

create table events (
    sensor_id integer not null, 
    event_type integer not null, 
    value integer not null, 
    time timestamp unique not null 
); 

И это выглядит примерно так:

sensor_id | event_type | value  | time 


-----------+------------+------------+-------------------- 
    2   | 2   | 5   | 2014-02-13 12:42:00 
    2   | 4   | -42  | 2014-02-13 13:19:57 
    2   | 2   | 2   | 2014-02-13 14:48:30 
    3   | 2   | 7   | 2014-02-13 12:54:39 
    2   | 3   | 54   | 2014-02-13 13:32:36 

, что это самый простой способ, чтобы вернуть самое последнее значение с точки зрения времени: sensor_id и event_type? так это выглядит следующим образом:

sensor_id | event_type | value 


-----------+------------+----------- 
    2   | 2   | 2 
    2   | 3   | 54 
    2   | 4   | -42 
    3   | 2   | 7 

я не могу получить мою голову вокруг него

ответ

1

Один из способов это делать:

SELECT value FROM events WHERE sensor_id=? AND event_type=? ORDER BY time DESC 

Тогда первый один является самым последним.

Базы данных могут иногда ограничивать вас только одним, в зависимости от требуемой базы данных.

Я поставил вопросительный знак, где вам нужно было бы поместить номер.

2

попробовать код T-SQL ниже:

SELECT e.sensor_id, e.event_type, e.value 
FROM 
    (SELECT e.sensor_id, time = MAX(e.time) 
     FROM dbo.events e WITH(NOLOCK) 
     GROUP BY e.sensor_id, e.event_type) m 
    JOIN dbo.events e WITH(NOLOCK) ON e.sensor_id = m.sensor_id 
     AND e.time = m.time 
ORDER BY e.sensor_id 

Как ваши сортировки строк? похоже, не может видеть шаблон.

EDIT: получил сортировку прямо сейчас!

SELECT e.sensor_id, e.event_type, e.value 
FROM 
    (SELECT e.sensor_id, time = MAX(e.time) 
     FROM dbo.events e WITH(NOLOCK) 
     GROUP BY e.sensor_id, e.event_type) m 
    JOIN dbo.events e WITH(NOLOCK) ON e.sensor_id = m.sensor_id 
     AND e.time = m.time 
ORDER BY e.sensor_id, e.sensor_id + e.event_type 
0
SELECT 
    sensor_id, event_type, value 
FROM 
(
    SELECT 
     ROW_NUMBER() OVER 
      (PARTITION BY sensor_id, event_type ORDER BY time DESC) AS Ordering, 
     * 
    FROM events 
) data 
WHERE 
    data.Ordering = 1