2016-12-21 9 views
-1

Мне нужно собрать набор данных, выбрав MAX (Date) и SECONDMAX (DATE) в одном результирующем наборе.Выбор второй максимальной даты - несколько записей

Источник данных, однако, содержит несколько записей, которые будут иметь несколько различных дат MAX/SECONDMAX.

Каждая запись имеет уникальный код сущности, как я могу определить, какой набор дат принадлежит тому объекту.

я написал ниже запрос, однако я получаю сообщение о том,

«Код ошибки:. 1111. Неправильное использование функции группы

SELECT 
    entity_code 'Entity Code', 
    (SELECT MAX(visit_date) 
    FROM z_dev.entities_visited A 
    WHERE visit_date < (SELECT MAX(visit_date) 
         FROM z_dev.entities_visited D 
         WHERE D.entity_code = A.entity_code) AND 
          C.entity_code = A.entity_code), 
    (SELECT MAX(visit_date) 
    FROM z_dev.entities_visited B 
    WHERE visit_date = MAX(visit_date) AND C.entity_code = B.entity_code), 
    cycle_end_date 
FROM z_dev.entities_visited C 
GROUP BY entity_code; 

SAMPLE DATA

entity_code | visit_date | cycle_end_date 
------------+------------+--------------- 
108792  |2016-12-07 |2016-12-11  
108793  |2016-12-08 |2016-12-11  
108795  |2016-12-06 |2016-12-11  
108796  |2016-12-05 |2016-12-11  
108795  |2016-12-13 |2016-12-18  
108792  |2016-12-14 |2016-12-18  
108793  |2016-12-14 |2016-12-18  
108796  |2016-12-16 |2016-12-18 
+0

дают нам некоторые данные примера http://sqlfiddle.com/ –

+0

См http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for -what-seem-to-me-to-be-a-very-simple-sql-query – Strawberry

ответ

1

Как я понимаю, вы хотите получить максимальную дату и вторую максимальную дату за entity_code. для этого следующее может помочь вам

SELECT x.entityCode 'Entity Code', 
    x.maxDate, 
    (SELECT MAX(visit_date) AS secMaxDate FROM z_dev.entities_visited 
     WHERE entity_code=x.entityCode AND visit_date<x.maxDate), 
    cycle_end_date 
FROM 
    (SELECT entity_code AS entityCode,MAX(visit_date) AS maxDate 
    FROM z_dev.entities_visited GROUP BY entity_code) AS X 
+0

Спасибо, именно то, что я ищу. Что я хотел бы добавить к этому сейчас, так это количество раз, которое этот объект посещали за последние 28 дней. –

1

Попробуйте это:

SELECT 
    entity_code 'Entity Code', 
    -- Correlated subquery to get the MAX date 
    (SELECT MAX(visit_date) 
    FROM entities_visited A 
    WHERE A.entity_code = C.entity_code) AS max_visit_date, 
    -- Correlated subquery to get second the MAX date 
    (SELECT visit_date 
    FROM entities_visited B 
    WHERE B.entity_code = C.entity_code 
    ORDER BY visit_date DESC LIMIT 1 OFFSET 1) AS max_visit_date2 
FROM entities_visited C 
GROUP BY entity_code; 

Запрос использует коррелированные подзапросы для того, чтобы извлечь максимум и второй максимум visit_date за entity_code. Мы можем использовать OFFSET с предложением ORDER BY, чтобы получить вторую максимальную дату.

Demo here