2016-11-11 2 views
0

Таблица:MySQL - выбор строки под идентификатором, группа по значению столбца, который имеет самую последнюю метку времени

---------------------------------------------------- 
ID | field_name | field_value | timestamp 
---------------------------------------------------- 
2 | postcode | LS1   | 2016-11-09 16:45:15 
2 | age  | 34   | 2016-11-09 16:45:22 
2 | job  | Scientist | 2016-11-09 16:45:27 
2 | age  | 38   | 2016-11-09 16:46:40 
7 | postcode | LS5   | 2016-11-09 16:47:05 
7 | age  | 24   | 2016-11-09 16:47:44  

Интересно, если кто-то может дать мне несколько советов, исходя из приведенных выше данных, я хотел бы запрос по ID 2, верните строку для каждого уникального имени_поля (если более одного строка существует под одним и тем же идентификатором с тем же именем_поля, то просто верните строку с последней меткой времени).

Мне удалось достичь этого, сгруппировав поле_имя, которое вернет список уникальных строк, но не обязательно последнюю строку.

SELECT * FROM fragment WHERE (id = :id) GROUP BY field_name 

Я бы очень признателен за любые указатели на то, что именно я должен делать здесь, и как я мог соответствовать что-то вдоль линий MAX (метки времени) в этом запросе

Большое спасибо!

ответ

1

Рассмотрите сначала необходимость набора данных для каждого ID, FieldName с максимальной меткой времени. (сгенерировать этот набор) в виде встроенного представления (B ниже). Затем присоедините это множество (B) к базовому набору, позволяя внутреннему соединению устранить нежелательные строки.

SELECT A.ID, A.field_name, A.field_value, A.timestamp 
FROM Table A 
INNER JOIN (SELECT ID, field_name, MAX(timestamp) TS 
      FROM table 
      GROUP BY ID, field_name) B 
on A.ID = B.ID 
and A.field_name = B.field_name 
and A.timestamp = B.TS 

Вне MySQL это может быть сделано с помощью окна/аналитических функций, как вы могли бы присвоить номер строки для каждой записи и устранить те> 1 что-то вроде ....

SELECT B.* 
FROM (SELECT A.ID 
      , A.field_name 
      , A.field_Vale 
      , A.timestamp 
      , Rownumber() over (Order by A.timestamp Desc) RN 
     FROM Table A) B 
WHERE B.RN = 1 

или с использованием креста применяются с лимитом или сверху.

+0

большое спасибо за пример, я применил логику на мой запрос, и под B (комплект) Я также добавил, куда пройти в ID Я хочу чтобы вернуться, большое спасибо за объяснение и дополнительный пример, я, конечно, только работаю с MySQL здесь, но большую ясность, спасибо. –

1

Самый простой способ сделать:

SELECT * 
    FROM fragment fra1 
    WHERE (id = :id) 
    and timestamp = (select max(timestamp) 
        from fragment fra2 
        where fra2.id = fra1.id 
         and fra2.field_name = fra1.field_name) 
    GROUP BY field_name 
+1

Вам нужно указать 'field_name' во внутреннем выборе. –

+0

Почему внешняя группа (без агрегации на 'select *')? В противном случае коррелированный подзапрос кажется, что он сработает. – xQbert

+0

проверить изменение: вы не можете поставить два поля в одном '=' сравнение –

Смежные вопросы