各項目の二番目に古い日付を表示する方法SQL:私は、クエリ表示最大日付(第1及び第2の最大日)
クエリのみ最大日付を表示:
SELECT
item_id,
MAX(post_date)
FROM market_price
GROUP BY item_id
各アイテムの2番目の最も古い/ 2番目の最大日付の表示方法を教えてください。
各項目の二番目に古い日付を表示する方法SQL:私は、クエリ表示最大日付(第1及び第2の最大日)
クエリのみ最大日付を表示:
SELECT
item_id,
MAX(post_date)
FROM market_price
GROUP BY item_id
各アイテムの2番目の最も古い/ 2番目の最大日付の表示方法を教えてください。
:(最大日付で)
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
);
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 |
とき/ 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
使用ROW_NUMBER順を日付ごとに派生テーブルの上に – maSTAShuFu
データの画像を投稿しないでください。テキストを私たちに与えることで、**あなたのお手伝いがもっと簡単に**でき、実際には良い答えが得られる可能性が高くなります。 –
@maSTAShuFuこれはSQL Serverのことです。 MySqlにはrow_numberのようなウィンドウ関数はありません –