2014-09-02 2 views
3

У меня есть таблица в SQLiteSQLITE эквивалент ROW_NUMBER

/* Create a table called NAMES */ 
CREATE TABLE EVENTS(Id integer , Eventtype integer,value integer,Timestamp DATETIME); 

/* Create few records in this table */ 
INSERT INTO EVENTS VALUES(1,2,1,'2009-01-01 10:00:00'); --ROW1 
INSERT INTO EVENTS VALUES(1,2,2,'2007-01-01 10:00:00'); --ROW2 
INSERT INTO EVENTS VALUES(2,2,3,'2008-01-01 10:00:00’); --ROW3 

Что требуется от запроса ROW1 и ROW3. Запрос должен содержать самую последнюю временную метку на основе строки для дубликата ID & Комбинация Eventtype. ROW1 и ROW2 имеют одинаковый тип события и идентификатор, но ROW1 является последним, поэтому его следует выбрать.

ответ

8

в SQLite 3.7.11 или более поздней версии, вы можете использовать GROUP BY с MAX(), чтобы выбрать строку в группе, чтобы вернуться:

SELECT *, MAX(timestamp) 
FROM events 
GROUP BY id, eventtype 

В более ранних версиях вам нужно найти уникальный идентификатор самой большой строки в группе с подзапросом (как в ответе).

0

я получил помощь по следующей ссылке: sqlite equivalent of row_number() over (partition by ...?

Вот что я придумал:

select * from events E1 where timestamp in 
(select timestamp from events E2 where E2.id = E1.id and E2.eventtype=E1.eventtype 
         order by E2.timestamp desc 
         LIMIT 1 ); 

Также с SQL SERVER, я имею в виду этого решения (как у меня нет никакой возможности для тестирования)

select id,eventtype,value,ROW_NUMBER() over 
(PARTITION BY id,eventtype,order by timestamp desc) AS RN from events where RN<=1 ; 
0

Я немного опоздал на этот вопрос, но я не был удовлетворен текущими ответами, поскольку они в основном используют correlated subqueries, что может серьезно испортить производительность.

Во многих ситуациях, в одну колонку аналитические функции могут моделироваться с использованием стандартного присоединения:

SELECT e.* 
FROM events e 
JOIN 
(
    -- Our simulated window with analytical result 
    SELECT id, eventtype, MAX(timestamp) AS timestamp 
    FROM events 
    GROUP BY id, eventtype 
) win 
USING (id, eventtype, timestamp) 

В общем, картина:

SELECT main.* 
FROM main 
JOIN 
(
    SELECT 
     partition_columns, 
     FUNCTION(analyzed_column) AS analyzed_column 
    FROM main 
    GROUP BY partition_columns 
) win 
USING (partition_columns, analyzed_column) 

Эти смоделированные окна не идеальны:

  1. Если у ваших данных есть привязки для анализируемого результата столбца, вам может потребоваться удалить дубликаты из вашего результата задавать. В противном случае вы выберете каждую строку из вашего раздела, которая соответствует анализируемому результату столбца.
  2. Если аналитическая функция требует упорядочения более чем на один столбец, вместо этого вам нужно будет использовать коррелированные подзапросы. Другие ответы могут быть изменены для достижения желаемого результата.
Смежные вопросы