Mysql SQL:查询显示最大日期(第一个和第二个最大日期)

Mysql SQL:查询显示最大日期(第一个和第二个最大日期),mysql,sql,Mysql,Sql,如何显示每个项目的第二个最早日期 我的查询仅显示最长日期: SELECT item_id, MAX(post_date) FROM market_price GROUP BY item_id 如何显示每个项目的第二个最早日期/第二个最长日期?在MySQL将窗口函数引入发布版本之前,您可以通过使用有序子查询和一些变量来模拟row_number()over()的效果 演示可在 MySQL 5.6架构设置: CREATE TABLE market_price (`item_id

如何显示每个项目的第二个最早日期

我的查询仅显示最长日期:

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


如何显示每个项目的第二个最早日期/第二个最长日期?

在MySQL将窗口函数引入发布版本之前,您可以通过使用有序子查询和一些变量来模拟
row_number()over()
的效果

演示可在

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')
;
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 |
查询1

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')
;
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 |

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')
;
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\u 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

我认为这将在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
                     );

在派生表上使用按日期排序的行数(具有最大日期),请不要发布数据的图像。给我们文本可以让我们更容易地帮助您,这也让您更有可能得到一个好的答案。@maSTAShuFu这是一个Sql Server的东西。MySql没有像row_numbermysql 8.0那样的窗口功能。这是一个简单的google away。例如“nth max mysql”。对于专门针对第二个google“second matx mysql”的解决方案,请阅读。