2017-01-05 4 views
0

しかし価格なければならない場合、我々は次のデータSQLのため、2番目の列は

id | date | price 
------------------------ 
1 | 10-09-2016 | 200  
2 | 11-09-2016 | 190  
3 | 12-09-2016 | 210  
4 | 13-09-2016 | 220  
5 | 14-09-2016 | 200  
6 | 15-09-2016 | 200  
7 | 16-09-2016 | 230  
8 | 17-09-2016 | 240 

を持っているし、我々は最初の日付、および価格秒で注文するとしましょう順序を満たしていない場合は省略順番になる。現在の価格が以前よりも低い場合、結果は次のようになります。

id | date | price 
------------------------ 
1 | 10-09-2016 | 200 
3 | 12-09-2016 | 210 
4 | 13-09-2016 | 220 
7 | 16-09-2016 | 230 
8 | 17-09-2016 | 240 

参加なしで可能ですか?

+1

mysqlまたはpostgres? – GurV

+1

'Postgresql' <>' Mysql'はあなたが使っている2つの異なるdbエンジンですか? –

+0

は問題ではありません。すべての解決策 – Doseke

答えて

2

使用LAGウィンドウ関数

SELECT * 
FROM (SELECT *, 
       Lag(price)OVER(ORDER BY date) AS prev_price 
     FROM Yourtable) a 
WHERE price > prev_price 
     OR prev_price IS NULL -- to get the first record 
+0

良い解決策!しかし、ORDER BY句には価格も含まれていないはずですか? –

0

のPostgresの場合:

select id, date, price 
from 
(select 
    t.*, 
    price - lag(price, 1, price) over (order by id) diff 
from 
    your_table) t 
where diff > 0; 

MySQLの場合:

select id, date, price from 
(
    select t.*, 
     price - @lastprice diff, 
     @lastprice := price 
    from 
    (select * 
    from your_table 
    order by id) t 
    cross join (select @lastprice := 0) t2 
) t where t.diff > 0; 
1

"以前は" 出力内の前の行を意味することになっている場合を入力し、実行中の最大値を記録します。 window functionサブクエリを持つPostgresソリューション:

SELECT id, date, price 
FROM (
    SELECT *, price >= max(price) OVER (ORDER BY date, price) AS ok 
    FROM tbl 
    ) sub 
WHERE ok; 
関連する問題