2017-12-15 16 views
0

各項目の二番目に古い日付を表示する方法SQL:私は、クエリ表示最大日付(第1及び第2の最大日)

https://i.stack.imgur.com/NN17o.png

クエリのみ最大日付を表示:

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

https://i.stack.imgur.com/Gi443.png

各アイテムの2番目の最も古い/ 2番目の最大日付の表示方法を教えてください。

+0

使用ROW_NUMBER順を日付ごとに派生テーブルの上に – maSTAShuFu

+2

データの画像を投稿しないでください。テキストを私たちに与えることで、**あなたのお手伝いがもっと簡単に**でき、実際には良い答えが得られる可能性が高くなります。 –

+1

@maSTAShuFuこれはSQL Serverのことです。 MySqlにはrow_numberのようなウィンドウ関数はありません –

答えて

1

:(最大日付で)

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 
; 

Results

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

とき/ row_number() over()が利用可能に使用される場合は、この:

私はこれは、MySQLで動作すると思います
select 
* 
from (
    select * 
      , row_number() over(partition by item_id order by post_date desc) rn 
    from market_price 
    ) d 
where rn = 2 
関連する問題