SQL: запрос отображает максимальную дату (первая и вторая максимальная дата) [дубликаты]

0

как отобразить вторую старую дату каждого элемента

Изображение 174551

в запросе у меня отображается только максимальная дата:

SELECT
  item_id,
  MAX(post_date)
FROM market_price
GROUP BY item_id

Изображение 174551

как отобразить вторую самую старую/вторую максимальную дату каждого элемента?

Теги:

2 ответа

1
Лучший ответ

Я думаю, что это будет работать в MySQL:

select mp.*
from market_price mp
where mp.post_date = (select mp2.post_date
                      from market_price mp2
                      where mp2.item = mp.item
                      order by mp2.post_date
                      offset 1 limit 1
                     );
0

Пока MySQL не введет оконные функции в выпущенную версию, вы можете имитировать эффект row_number() over() с помощью упорядоченного подзапроса и некоторых переменных.

Демонстрация доступна в SQL Fiddle

MySQL 5.6 Настройка схемы:

CREATE TABLE market_price 
    ('item_id' varchar(3), 'post_date' datetime)
;

INSERT INTO market_price 
    ('item_id', 'post_date')
VALUES
    ('abc', '2017-12-01 00:00:00'),
    ('abc', '2017-12-02 00:00:00'),
    ('abc', '2017-12-03 00:00:00'),
    ('def', '2017-12-04 00:00:00'),
    ('def', '2017-12-05 00:00:00'),
    ('def', '2017-12-06 00:00:00'),
    ('def', '2017-12-07 00:00:00'),
    ('def', '2017-12-08 00:00:00')
;

Запрос 1:

SELECT
        item_id
      , post_date
FROM (
      SELECT
            @row_num :=IF(@prev_value=item_id,@row_num+1,1) AS rn
          , mp.item_id
          , mp.post_date
          , @prev_value := item_id
      FROM market_price mp
      CROSS JOIN (SELECT @row_num :=1,  @prev_value :='') vars
      ORDER BY
            mp.item_id
          , mp.post_date DESC
    ) d
WHERE rn = 2
;

Результаты:

| item_id |            post_date |
|---------|----------------------|
|     abc | 2017-12-02T00:00:00Z |
|     def | 2017-12-07T00:00:00Z |

Когда /if row_number() over() доступен, используйте следующее:

select
*
from (
     select *
          , row_number() over(partition by item_id order by post_date desc) rn
     from market_price
     ) d
where rn = 2

Ещё вопросы

Сообщество Overcoder
Наверх
Меню