2017-02-03 17 views
0

あたりの累積レコードを数える:私は(時間に累積的にレコードを追加)以下の結果を持っているために、単一のクエリで、MySQLは、私は次のようになり、テーブル持た日

DATE  | S_ID 1 | S_ID 2 
2016-01-01 | 1 | 0 
2016-01-02 | 3 | 1 
2016-01-03 | 3 | 1 
2016-01-04 | 3 | 5 
2016-01-05 | 5 | 6 
をしようとしています

S_ID | DATE 
1  2016-01-01 
1  2016-01-02 
1  2016-01-02 
1  2016-01-05 
1  2016-01-05 
2  2017-01-02 
2  2017-01-04 
2  2017-01-04 
2  2017-01-04 
2  2017-01-04 
2  2017-01-05 

提案がありますか?

+1

"正規化" の出力を使用してください。すべてのIDがすぐにわからない場合、S_ID(行)を列に変換するのは悪いです。 'Group by S_ID、DATE'を使用して、ユーザーと日ごとに「使用可能な結果」を取得します。 – dognose

+0

ああ、 "累積的" - 正規化されたクエリに少しオーバーヘッドが追加されます:-) – dognose

答えて

1

日付と条件付き合計でユーザー変数とともにグループを使用して累積合計を取得してみてください。

Select date, 
    @s1 := @s1 + s_id_1 s_id_1, 
    @s2 := @s2 + s_id_2 s_id_2 
From (select 
    date, 
    sum(s_id = 1) s_id_1, 
    sum(s_id = 2) s_id_2 
from your_table 
group by date 
Order by date) t cross join (select @s1 := 0, @s2 :=0) t2; 

それは真が1であるという事実を使用し、falseが

+0

10.000ユーザーでこれを行うことはできますか? – dognose

+0

@dognose - 明らかに、あなたはその場合にこれをしたくありません。 – GurV

+0

@downvoter - 何らかの理由がありますか? – GurV

0

あなたはより良いこれはあなたの望ましい結果を提供することはありません

select 
    t.s_ID, 
    t.`date`, 
    (SELECT SUM(1) FROM table x WHERE x.`date` <= t.`date` AND x.S_ID = t.S_ID) AS cumulative_sum 
from table t 
group by s_ID,`date`; 

使用すべきMySQLで0ですが、形情報は同じままながら、ユーザーの数とは無関係に働く結果:

s_ID | DATE  | cumulative_sum 
1  2016-01-01 1 
1  2016-01-02 3 
1  2016-01-05 5 
2  2016-01-02 1 
2  2016-01-04 5 
2  2016-01-05 6 

(ID /日付ペアのエントリがない場合、その日はカウントが変更されませんでした)

0

PREPAREDステートメントでこれを受け取ることができます。最初のクエリは、テーブル内のすべてのs_idを含むクエリを生成します。あなただけのあなたのテーブル名にYOYOURTABLEを変更する必要があります。 サンプルを参照してください

CONCAT('SELECT `date`,' 
      ,GROUP_CONCAT(f1) 
      ,' FROM YOURTABLE GROUP BY DATE') 
    INTO @myquery 
    FROM (
    SELECT DISTINCT CONCAT('sum(s_id = ',s_id,') AS sid_',s_id) AS f1 
    FROM yourtable 
    ) tab1; 

-- ONLY for Test to verify the Query 
SELECT @myquery; 


PREPARE test FROM @myquery; 
EXECUTE test; 
DEALLOCATE PREPARE test; 

サンプル

mysql> SELECT * FROM yourtable; 
+------+------------+ 
| s_id | date  | 
+------+------------+ 
| 1 | 2016-01-01 | 
| 1 | 2017-02-02 | 
| 2 | 2017-01-05 | 
| 4 | 2016-03-04 | 
| 7 | 2016-12-12 | 
+------+------------+ 
5 rows in set (0,01 sec) 

mysql> SELECT 
    ->  CONCAT('SELECT `date`,' 
    ->    ,GROUP_CONCAT(f1) 
    ->    ,' FROM YOURTABLE GROUP BY DATE') 
    ->  INTO @myquery 
    ->  FROM (
    ->  SELECT DISTINCT CONCAT('sum(s_id = ',s_id,') AS sid_',s_id) AS f1 
    ->  FROM yourtable 
    -> ) tab1; 
Query OK, 1 row affected (0,01 sec) 

mysql> SELECT @myquery; 
+----------------------------------------------------------------------------------------------------------------------------------------+ 
| @myquery                                | 
+----------------------------------------------------------------------------------------------------------------------------------------+ 
| SELECT `date`,sum(s_id = 1) AS sid_1,sum(s_id = 2) AS sid_2,sum(s_id = 4) AS sid_4,sum(s_id = 7) AS sid_7 FROM YOURTABLE GROUP BY DATE | 
+----------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0,00 sec) 

mysql> PREPARE test FROM @myquery; 
Query OK, 0 rows affected (0,00 sec) 

mysql> EXECUTE test; 
+------------+-------+-------+-------+-------+ 
| date  | sid_1 | sid_2 | sid_4 | sid_7 | 
+------------+-------+-------+-------+-------+ 
| 2016-01-01 |  1 |  0 |  0 |  0 | 
| 2016-03-04 |  0 |  0 |  1 |  0 | 
| 2016-12-12 |  0 |  0 |  0 |  1 | 
| 2017-01-05 |  0 |  1 |  0 |  0 | 
| 2017-02-02 |  1 |  0 |  0 |  0 | 
+------------+-------+-------+-------+-------+ 
5 rows in set (0,00 sec) 

mysql> DEALLOCATE PREPARE test; 
Query OK, 0 rows affected (0,00 sec) 

mysql> 
関連する問題