Выбрать Max из столбца даты, сгруппированного по определенному полю - PullRequest
1 голос
/ 17 января 2011

У меня есть таблица, похожая на эту:

LogId  RefId   Entered
==================================
1      1       2010-12-01
2      1       2010-12-04
3      2       2010-12-01
4      2       2010-12-06
5      3       2010-12-01
6      1       2010-12-10
7      3       2010-12-05
8      4       2010-12-01

Здесь LogId уникален; Для каждого RefId есть несколько записей с отметкой времени. То, что я хочу извлечь, это LogId для каждого последнего RefId.

Я попробовал решения по этой ссылке: /80270/izvlech-stroku-kotoraya-imeet-znachenie-max-dlya-stolbtsa. Но он возвращает несколько строк с одинаковым RefId. LogId и RefId должны быть уникальными.

Может ли кто-нибудь помочь мне с этим?

Спасибо

Vamyip

Ответы [ 3 ]

3 голосов
/ 17 января 2011

Вам нужно использовать подзапрос, который извлекает последнее значение Введенное для каждого RefId, а затем присоединить к нему исходную таблицу в RefId, Введено:

SELECT DISTINCT MyTable.LogId, MyTable.Entered FROM MyTable
INNER JOIN (SELECT RefId, MAX(Entered) as Entered FROM MyTable GROUP BY RefId) Latest
ON MyTable.RefId = Latest.RefId AND MyTable.Entered = Latest.Entered
0 голосов
/ 17 января 2011

Чтобы правильно обрабатывать дубликаты:

SELECT  m.*
FROM    (
        SELECT  DISTINCT refid
        FROM    mytable
        ) md
JOIN    mytable m
ON      m.LogID = 
        (
        SELECT  LogID
        FROM    mytable mi
        WHERE   mi.refid = md.refid
        ORDER BY
                mi.refid DESC, mi.entered DESC, mi.logid DESC
        LIMIT 1
        )

Создайте индекс для mytable (refid, entered, logid), чтобы он работал быстро.

0 голосов
/ 17 января 2011

Поскольку появляется идентификатор журнала с автоматическим приращением, они будут помечены датой / временем в последовательном порядке. Таким образом, захватывая последний LogID для каждого ссылочного идентификатора, вы получите «самый последний» из приведенного ниже «PreQuery», а затем присоединитесь на основе этого единственного идентификатора к исходной таблице, чтобы получить фактическую информацию о дате (или другие сведения). ) вам нужно из фактического журнала.

select PreQuery.RefID,
       PreQuery.LastLogEntry,
       L.Entered
   from 
      ( select RefID,
               Max( LogID ) LastLogEntry
           from 
               YourLog
           group by
               RefID ) PreQuery,
      YourLog L
   where
      PreQuery.LastLogEntry = L.LogID
...