2017-04-20 11 views
0

Iは、(MySQLの)テーブルを有する表の値との間のギャップを埋める - MySQLの

UserID | CreationTS | Type   | Value | Bonus Value  
259275 | 2012-08-01 | Deposit  | -------- | NULL 
259275 | 2012-08-02 | BonusApplied |  175 | 175 
259275 | 2012-08-03 | TradeOrder | -------- | 175 
259275 | 2012-08-06 | TradeOrder | -------- | 175 
259275 | 2012-08-10 | BonusApplied |  180 | 180 
259275 | 2012-08-11 | TradeOrder | -------- | 180 
259275 | 2012-08-12 | TradeOrder | -------- | 180 
259275 | 2012-08-15 | TradeOrder | -------- | 180 
259275 | 2012-08-17 | BonusApplied |  200 | 200 
259275 | 2012-08-18 | TradeOrder | -------- | 200 
259681 | 2012-08-01 | Deposit  | -------- | NULL 
259681 | 2012-08-02 | BonusApplied |  175 | 175 
259681 | 2012-08-03 | TradeOrder | -------- | 175 
259681 | 2012-08-06 | TradeOrder | -------- | 175 
259681 | 2012-08-10 | BonusApplied |  180 | 180 
259681 | 2012-08-11 | TradeOrder | -------- | 180 
259681 | 2012-08-12 | TradeOrder | -------- | 180 
259681 | 2012-08-15 | TradeOrder | -------- | 180 
259681 | 2012-08-17 | BonusApplied |  200 | 200 
259681 | 2012-08-18 | TradeOrder | -------- | 200 

Iが最初に基づいて、ユーザIDごとに、BonusApplied型との間に、充填されたVALUEのギャップを埋めるために必要ユーザーあたりの価値とBonusApplied。 最終値はボーナス値列にあります。それだけが必要。 JOINの代わりに@variablesに基づいた解決策がある場合、それは素晴らしいでしょう。

+0

http://meta.stackoverflow.com/questions/333952/why-should-i-provide-anを参照してください。 -mcve-for-what-like-to-be-a-very-simple-sql-query – Strawberry

答えて

1

ことは、これを試してみてください:

CREATE TABLE bonusTable (userID INT UNSIGNED, CreationTs DATE, `Type` CHAR(32), `Value` INT UNSIGNED, BonusValue INT); 

INSERT INTO bonusTable VALUES 
(259275, '2012-08-01', 'Deposit', NULL, NULL), 
(259275, '2012-08-02', 'BonusApplied', 175, 175), 
(259275, '2012-08-03', 'TradeOrder', NULL, 175), 
(259275, '2012-08-06', 'TradeOrder', NULL, 175), 
(259275, '2012-08-10', 'BonusApplied', 180, 180), 
(259275, '2012-08-11', 'TradeOrder', NULL, 180), 
(259275, '2012-08-12', 'TradeOrder', NULL, 180), 
(259275, '2012-08-15', 'TradeOrder', NULL, 180), 
(259275, '2012-08-17', 'BonusApplied', 200, 200), 
(259275, '2012-08-18', 'TradeOrder', NULL, 200), 
(259681, '2012-08-01', 'Deposit', NULL, NULL), 
(259681, '2012-08-02', 'BonusApplied', 175, 175), 
(259681, '2012-08-03', 'TradeOrder', NULL, 175), 
(259681, '2012-08-06', 'TradeOrder', NULL, 175), 
(259681, '2012-08-10', 'BonusApplied', 180, 180), 
(259681, '2012-08-11', 'TradeOrder', NULL, 180), 
(259681, '2012-08-12', 'TradeOrder', NULL, 180), 
(259681, '2012-08-15', 'TradeOrder', NULL, 180), 
(259681, '2012-08-17', 'BonusApplied', 200, 200), 
(259681, '2012-08-18', 'TradeOrder', NULL, 200); 


SET @VUserID := NULL; 
SET @VValue := NULL; 

SELECT CreationTs, `Type`, IF(@VUserID = userID, IF(`Value` IS NULL, @VValue, @VValue := `Value`), @VValue := `Value`) BonusValue, @VUserID := userID userID FROM bonusTable ORDER BY userID, CreationTs; 

#Cols in original order: 
SELECT userID, CreationTs, `Type`, BonusValue FROM (
SELECT CreationTs, `Type`, IF(@VUserID = userID, IF(`Value` IS NULL, @VValue, @VValue := `Value`), @VValue := `Value`) BonusValue, @VUserID := userID userID FROM bonusTable ORDER BY userID, CreationTs 
) A; 
+0

作品は魅力的です!ありがとう – Michael

+0

助けてくれてうれしいです。最も役に立つと答えられた場合には答えを受け入れることを検討してください。このようにコミュニティへの私の価値が反映され、私が立ち往生して質問をすると、役に立つ回答の確率が高まります。 –

0

は、ここでのJOIN型ソリューションです:

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL 
,seq INT NOT NULL 
,value INT NULL 
,PRIMARY KEY(id,seq) 
); 

INSERT INTO my_table VALUES 
(101, 1,NULL), 
(101, 2,175), 
(101, 4,NULL), 
(101, 7,NULL), 
(101, 9,180), 
(101,11,NULL), 
(102, 2,NULL), 
(102, 3,175), 
(102, 4,NULL), 
(102, 7,NULL), 
(102, 9,200), 
(102,12,NULL); 

SELECT x.* 
    , MAX(y.value) i 
    FROM my_table x 
    JOIN my_table y 
    ON y.id = x.id 
    AND y.seq <= x.seq 
GROUP 
    BY x.id,x.seq; 
+-----+-----+-------+------+ 
| id | seq | value | i | 
+-----+-----+-------+------+ 
| 101 | 1 | NULL | NULL | 
| 101 | 2 | 175 | 175 | 
| 101 | 4 | NULL | 175 | 
| 101 | 7 | NULL | 175 | 
| 101 | 9 | 180 | 180 | 
| 101 | 11 | NULL | 180 | 
| 102 | 2 | NULL | NULL | 
| 102 | 3 | 175 | 175 | 
| 102 | 4 | NULL | 175 | 
| 102 | 7 | NULL | 175 | 
| 102 | 9 | 200 | 200 | 
| 102 | 12 | NULL | 200 | 
+-----+-----+-------+------+ 
+0

これはなぜ機能しますか? – Martin

+0

@マーティンそれは大きな問題です。便利な方法は、集計関数を削除してGROUP BY句をORDER BY句に置き換えると、どの行が返されるかを検討することです。 – Strawberry

+0

私は実際にあなたが投稿したSQLがなぜ作品になったのかについて、何らかの形で説明してくれました。おかげで ':-)' – Martin

関連する問題