2017-04-17 6 views
0

このテーブルは、ペットとその活動データ(休憩時間や運動時間など)を含むように設計されています。表の定義は以下のとおりです。MySQLグループの詳細と数日間連続して集計

CREATE TABLE IF NOT EXISTS TEST_ACTIVITY(
    pet_id INT(11) UNSIGNED NOT NULL, 
    simple_sleep_time INT(11), 
    deep_sleep_time INT(11), 
    mild_movement_time INT(11), 
    moderate_movement_time INT(11), 
    severe_movement_time INT(11), 
    start_time INT(11) NOT NULL, 
    date DATE NOT NULL, 
    PRIMARY KEY (pet_id, start_time, date) 
) ENGINE=INNODB 

以下のデータがテーブルに挿入されます。

INSERT INTO TEST_ACTIVITY 
(pet_id, simple_sleep_time, deep_sleep_time, mild_movement_time, moderate_movement_time, severe_movement_time, start_time, date) 
VALUES 
(100, 1, 1, 1, 1, 1, 0, '2015-03-10'), 
(100, 2, 1, 1, 1, 1, 30, '2015-03-10'), 
(100, 3, 1, 1, 1, 1, 60, '2015-03-10'), 
(100, 4, 1, 1, 1, 1, 90, '2015-03-10'), 
(100, 5, 1, 1, 1, 1, 120, '2015-03-10'), 
(100, 6, 1, 1, 1, 1, 150, '2015-03-10'), 
(100, 7, 1, 1, 1, 1, 0, '2015-03-11'), 
(100, 8, 1, 1, 1, 1, 30, '2015-03-11'), 
(100, 9, 1, 1, 1, 1, 60, '2015-03-11'), 
(100, 10, 1, 1, 1, 1, 90, '2015-03-11'), 
(100, 11, 1, 1, 1, 1, 120, '2015-03-11'), 
(100, 12, 1, 1, 1, 1, 150, '2015-03-11'), 
(100, 13, 1, 1, 1, 1, 0, '2015-03-12'), 
(100, 14, 1, 1, 1, 1, 30, '2015-03-12'), 
(100, 15, 1, 1, 1, 1, 60, '2015-03-12'), 
(100, 16, 1, 1, 1, 1, 90, '2015-03-12'), 
(100, 17, 1, 1, 1, 1, 120, '2015-03-12'), 
(100, 18, 1, 1, 1, 1, 150, '2015-03-12'), 
(100, 19, 1, 1, 1, 1, 0, '2015-03-13'), 
(100, 20, 1, 1, 1, 1, 30, '2015-03-13'), 
(100, 21, 1, 1, 1, 1, 60, '2015-03-13'), 
(100, 22, 1, 1, 1, 1, 90, '2015-03-13'), 
(100, 23, 1, 1, 1, 1, 120, '2015-03-13'), 
(100, 24, 1, 1, 1, 1, 150, '2015-03-13'), 
(101, 25, 1, 1, 1, 1, 0, '2015-03-10'), 
(101, 26, 1, 1, 1, 1, 30, '2015-03-10'), 
(101, 27, 1, 1, 1, 1, 60, '2015-03-10'), 
(101, 28, 1, 1, 1, 1, 90, '2015-03-10'), 
(101, 29, 1, 1, 1, 1, 120, '2015-03-10'), 
(101, 30, 1, 1, 1, 1, 150, '2015-03-10'), 
(101, 31, 1, 1, 1, 1, 0, '2015-03-11'), 
(101, 32, 1, 1, 1, 1, 30, '2015-03-11'), 
(101, 33, 1, 1, 1, 1, 60, '2015-03-11'), 
(101, 34, 1, 1, 1, 1, 90, '2015-03-11'), 
(101, 35, 1, 1, 1, 1, 120, '2015-03-11'), 
(101, 36, 1, 1, 1, 1, 150, '2015-03-11'), 
(101, 37, 1, 1, 1, 1, 0, '2015-03-12'), 
(101, 38, 1, 1, 1, 1, 30, '2015-03-12'), 
(101, 39, 1, 1, 1, 1, 60, '2015-03-12'), 
(101, 40, 1, 1, 1, 1, 90, '2015-03-12'), 
(101, 41, 1, 1, 1, 1, 120, '2015-03-12'), 
(101, 42, 1, 1, 1, 1, 150, '2015-03-12'), 
(101, 43, 1, 1, 1, 1, 0, '2015-03-13'), 
(101, 44, 1, 1, 1, 1, 30, '2015-03-13'), 
(101, 45, 1, 1, 1, 1, 60, '2015-03-13'), 
(101, 46, 1, 1, 1, 1, 90, '2015-03-13'), 
(101, 47, 1, 1, 1, 1, 120, '2015-03-13'), 
(101, 48, 1, 1, 1, 1, 150, '2015-03-13'), 
(102, 49, 1, 1, 1, 1, 0, '2015-03-10'), 
(102, 50, 1, 1, 1, 1, 30, '2015-03-10'), 
(102, 51, 1, 1, 1, 1, 60, '2015-03-10'), 
(102, 52, 1, 1, 1, 1, 90, '2015-03-10'), 
(102, 53, 1, 1, 1, 1, 120, '2015-03-10'), 
(102, 54, 1, 1, 1, 1, 150, '2015-03-10'), 
(102, 55, 1, 1, 1, 1, 0, '2015-03-11'), 
(102, 56, 1, 1, 1, 1, 30, '2015-03-11'), 
(102, 57, 1, 1, 1, 1, 60, '2015-03-11'), 
(102, 58, 1, 1, 1, 1, 90, '2015-03-11'), 
(102, 59, 1, 1, 1, 1, 120, '2015-03-11'), 
(102, 60, 1, 1, 1, 1, 150, '2015-03-11'), 
(102, 61, 1, 1, 1, 1, 0, '2015-03-12'), 
(102, 62, 1, 1, 1, 1, 30, '2015-03-12'), 
(102, 63, 1, 1, 1, 1, 60, '2015-03-12'), 
(102, 64, 1, 1, 1, 1, 90, '2015-03-12'), 
(102, 65, 1, 1, 1, 1, 120, '2015-03-12'), 
(102, 66, 1, 1, 1, 1, 150, '2015-03-12'), 
(102, 67, 1, 1, 1, 1, 0, '2015-03-13'), 
(102, 68, 1, 1, 1, 1, 30, '2015-03-13'), 
(102, 69, 1, 1, 1, 1, 60, '2015-03-13'), 
(102, 70, 1, 1, 1, 1, 90, '2015-03-13'), 
(102, 71, 1, 1, 1, 1, 120, '2015-03-13'), 
(102, 72, 1, 1, 1, 1, 150, '2015-03-13'); 

は、選択クエリを実行した後、結果は以下の通りである。各を決め、その後

score = SUM(severe_movement_time) + SUM(moderate_movement_time) + SUM(mild_movement_time) + SUM(simple_sleep_time), 

と:

select * from TEST_ACTIVITY ORDER BY pet_id, date, start_time; 

| pet_id | simple_sleep_time | deep_sleep_time | mild_movement_time | moderate_movement_time | severe_movement_time | start_time | date  | 
+--------+-------------------+-----------------+--------------------+------------------------+----------------------+------------+------------+ 
| 100 |     1 |    1 |     1 |      1 |     1 |   0 | 2015-03-10 | 
| 100 |     2 |    1 |     1 |      1 |     1 |   30 | 2015-03-10 | 
| 100 |     3 |    1 |     1 |      1 |     1 |   60 | 2015-03-10 | 
| 100 |     4 |    1 |     1 |      1 |     1 |   90 | 2015-03-10 | 
| 100 |     5 |    1 |     1 |      1 |     1 |  120 | 2015-03-10 | 
| 100 |     6 |    1 |     1 |      1 |     1 |  150 | 2015-03-10 | 
| 100 |     7 |    1 |     1 |      1 |     1 |   0 | 2015-03-11 | 
| 100 |     8 |    1 |     1 |      1 |     1 |   30 | 2015-03-11 | 
| 100 |     9 |    1 |     1 |      1 |     1 |   60 | 2015-03-11 | 
| 100 |    10 |    1 |     1 |      1 |     1 |   90 | 2015-03-11 | 
| 100 |    11 |    1 |     1 |      1 |     1 |  120 | 2015-03-11 | 
| 100 |    12 |    1 |     1 |      1 |     1 |  150 | 2015-03-11 | 
| 100 |    13 |    1 |     1 |      1 |     1 |   0 | 2015-03-12 | 
| 100 |    14 |    1 |     1 |      1 |     1 |   30 | 2015-03-12 | 
| 100 |    15 |    1 |     1 |      1 |     1 |   60 | 2015-03-12 | 
| 100 |    16 |    1 |     1 |      1 |     1 |   90 | 2015-03-12 | 
| 100 |    17 |    1 |     1 |      1 |     1 |  120 | 2015-03-12 | 
| 100 |    18 |    1 |     1 |      1 |     1 |  150 | 2015-03-12 | 
| 100 |    19 |    1 |     1 |      1 |     1 |   0 | 2015-03-13 | 
| 100 |    20 |    1 |     1 |      1 |     1 |   30 | 2015-03-13 | 
| 100 |    21 |    1 |     1 |      1 |     1 |   60 | 2015-03-13 | 
| 100 |    22 |    1 |     1 |      1 |     1 |   90 | 2015-03-13 | 
| 100 |    23 |    1 |     1 |      1 |     1 |  120 | 2015-03-13 | 
| 100 |    24 |    1 |     1 |      1 |     1 |  150 | 2015-03-13 | 
| 101 |    25 |    1 |     1 |      1 |     1 |   0 | 2015-03-10 | 
| 101 |    26 |    1 |     1 |      1 |     1 |   30 | 2015-03-10 | 
| 101 |    27 |    1 |     1 |      1 |     1 |   60 | 2015-03-10 | 
| 101 |    28 |    1 |     1 |      1 |     1 |   90 | 2015-03-10 | 
| 101 |    29 |    1 |     1 |      1 |     1 |  120 | 2015-03-10 | 
| 101 |    30 |    1 |     1 |      1 |     1 |  150 | 2015-03-10 | 
| 101 |    31 |    1 |     1 |      1 |     1 |   0 | 2015-03-11 | 
| 101 |    32 |    1 |     1 |      1 |     1 |   30 | 2015-03-11 | 
| 101 |    33 |    1 |     1 |      1 |     1 |   60 | 2015-03-11 | 
| 101 |    34 |    1 |     1 |      1 |     1 |   90 | 2015-03-11 | 
| 101 |    35 |    1 |     1 |      1 |     1 |  120 | 2015-03-11 | 
| 101 |    36 |    1 |     1 |      1 |     1 |  150 | 2015-03-11 | 
| 101 |    37 |    1 |     1 |      1 |     1 |   0 | 2015-03-12 | 
| 101 |    38 |    1 |     1 |      1 |     1 |   30 | 2015-03-12 | 
| 101 |    39 |    1 |     1 |      1 |     1 |   60 | 2015-03-12 | 
| 101 |    40 |    1 |     1 |      1 |     1 |   90 | 2015-03-12 | 
| 101 |    41 |    1 |     1 |      1 |     1 |  120 | 2015-03-12 | 
| 101 |    42 |    1 |     1 |      1 |     1 |  150 | 2015-03-12 | 
| 101 |    43 |    1 |     1 |      1 |     1 |   0 | 2015-03-13 | 
| 101 |    44 |    1 |     1 |      1 |     1 |   30 | 2015-03-13 | 
| 101 |    45 |    1 |     1 |      1 |     1 |   60 | 2015-03-13 | 
| 101 |    46 |    1 |     1 |      1 |     1 |   90 | 2015-03-13 | 
| 101 |    47 |    1 |     1 |      1 |     1 |  120 | 2015-03-13 | 
| 101 |    48 |    1 |     1 |      1 |     1 |  150 | 2015-03-13 | 
| 102 |    49 |    1 |     1 |      1 |     1 |   0 | 2015-03-10 | 
| 102 |    50 |    1 |     1 |      1 |     1 |   30 | 2015-03-10 | 
| 102 |    51 |    1 |     1 |      1 |     1 |   60 | 2015-03-10 | 
| 102 |    52 |    1 |     1 |      1 |     1 |   90 | 2015-03-10 | 
| 102 |    53 |    1 |     1 |      1 |     1 |  120 | 2015-03-10 | 
| 102 |    54 |    1 |     1 |      1 |     1 |  150 | 2015-03-10 | 
| 102 |    55 |    1 |     1 |      1 |     1 |   0 | 2015-03-11 | 
| 102 |    56 |    1 |     1 |      1 |     1 |   30 | 2015-03-11 | 
| 102 |    57 |    1 |     1 |      1 |     1 |   60 | 2015-03-11 | 
| 102 |    58 |    1 |     1 |      1 |     1 |   90 | 2015-03-11 | 
| 102 |    59 |    1 |     1 |      1 |     1 |  120 | 2015-03-11 | 
| 102 |    60 |    1 |     1 |      1 |     1 |  150 | 2015-03-11 | 
| 102 |    61 |    1 |     1 |      1 |     1 |   0 | 2015-03-12 | 
| 102 |    62 |    1 |     1 |      1 |     1 |   30 | 2015-03-12 | 
| 102 |    63 |    1 |     1 |      1 |     1 |   60 | 2015-03-12 | 
| 102 |    64 |    1 |     1 |      1 |     1 |   90 | 2015-03-12 | 
| 102 |    65 |    1 |     1 |      1 |     1 |  120 | 2015-03-12 | 
| 102 |    66 |    1 |     1 |      1 |     1 |  150 | 2015-03-12 | 
| 102 |    67 |    1 |     1 |      1 |     1 |   0 | 2015-03-13 | 
| 102 |    68 |    1 |     1 |      1 |     1 |   30 | 2015-03-13 | 
| 102 |    69 |    1 |     1 |      1 |     1 |   60 | 2015-03-13 | 
| 102 |    70 |    1 |     1 |      1 |     1 |   90 | 2015-03-13 | 
| 102 |    71 |    1 |     1 |      1 |     1 |  120 | 2015-03-13 | 
| 102 |    72 |    1 |     1 |      1 |     1 |  150 | 2015-03-13 | 
+--------+-------------------+-----------------+--------------------+------------------------+----------------------+------------+------------+ 

私が最初にこの式を使用して、各ペットの毎日のスコアを計算したいですそのスコアに基づいてペットのランク。重要な注意:ペットの1日間の活動データは2日間に拡大されます。例えば、pet_id = 100のために、2015年3月11日満足の活性データは、以下の条件:

(date = DATE_SUB(DATE('2015-03-11'), INTERVAL 1 DAY) AND start_time >= 120 AND start_time <= 150) OR (date = DATE('2015-03-11') AND start_time <= (120 - 30) AND start_time >= 0). 

すなわち、2015年3月11日の活動データは、次の6つのエントリが含ま:

date=2015-03-10, start_time=120 
date=2015-03-10, start_time=150 
date=2015-03-11, start_time=0 
date=2015-03-11, start_time=30 
date=2015-03-11, start_time=60 
date=2015-03-11, start_time=90 

次のクエリを使用することで、私は2015-03-11の1日間行うことができます。私の質問は、数日間連続して、例えば、3日(START_DATE = 2015年3月11日、END_DATE = 2015年3月13日)のスコアとランキングを算出するために、単一のクエリを作成する方法である

SELECT pet_id, date, score, rank 
FROM 
(
    SELECT scoreFinder.pet_id, scoreFinder.date, scoreFinder.score, @prev := @curr, @curr := score, @rank := IF(@prev = @curr, @rank, @rank+1) AS rank 
    FROM 
     (
      SELECT pet_id, date, (COALESCE(SUM(severe_movement_time), 0) + COALESCE(SUM(moderate_movement_time), 0) + COALESCE(SUM(mild_movement_time), 0) + COALESCE(SUM(simple_sleep_time), 0)) score 
      FROM TEST_ACTIVITY 
      WHERE ((date = DATE_SUB(DATE('2015-03-11'), INTERVAL 1 DAY) AND start_time >= 120 AND start_time <= 150) OR 
        (date = DATE('2015-03-11') AND start_time <= (120 - 30) AND start_time >= 0))  
      GROUP BY pet_id 
     ) scoreFinder, (SELECT @curr := null, @prev := null, @rank := 0) rank 
    ORDER BY score DESC 
) rankFinder 

。期待される結果は以下の通りです。ここで

| pet_id | date  | score | rank | 
+--------+------------+-------+------+ 
| 102 | 2015-03-11 | 351 | 1 | 
| 101 | 2015-03-11 | 207 | 2 | 
| 100 | 2015-03-11 | 63 | 3 | 
| 102 | 2015-03-12 | 387 | 1 | 
| 101 | 2015-03-12 | 243 | 2 | 
| 100 | 2015-03-12 | 99 | 3 | 
| 102 | 2015-03-13 | 423 | 1 | 
| 101 | 2015-03-13 | 279 | 2 | 
| 100 | 2015-03-13 | 135 | 3 | 

答えて

1

は一つの解決策である - ここでの基本的な考え方は、サブクエリで日付範囲を生成し、TEST_ACTIVITYテーブルとそれに参加することである:あなたのテストデータの

SELECT scores.*, 
     @rank := IF(@prev = date, @rank + 1, 1) AS rank, 
     @prev := date 
FROM (SELECT pet_id, 
       dates.date, 
       (Coalesce(Sum(severe_movement_time), 0) 
       + Coalesce(Sum(moderate_movement_time), 0) 
       + Coalesce(Sum(mild_movement_time), 0) 
       + Coalesce(Sum(simple_sleep_time), 0)) score 
     FROM (SELECT DISTINCT date 
       FROM TEST_ACTIVITY 
       WHERE date >= '2015-03-11' 
         AND date <= '2015-03-13' 
       ORDER BY date) dates 
       JOIN TEST_ACTIVITY t 
       ON ((t.date = Date_sub(Date(dates.date), INTERVAL 1 day) 
         AND t.start_time >= 120 
         AND t.start_time <= 150) 
         OR (t.date = Date(dates.date) 
          AND t.start_time <= (120 - 30) 
          AND t.start_time >= 0)) 
     GROUP BY dates.date, 
        t.pet_id 
     ORDER BY dates.date, 
        score DESC) scores, 
     (SELECT @prev := NULL, 
       @rank := 0) rank; 

結果:

pet_id date score rank @prev := date 
102 2015-03-11 351 1 2015-03-11 
101 2015-03-11 207 2 2015-03-11 
100 2015-03-11 63 3 2015-03-11 
102 2015-03-12 387 1 2015-03-12 
101 2015-03-12 243 2 2015-03-12 
100 2015-03-12 99 3 2015-03-12 
102 2015-03-13 423 1 2015-03-13 
101 2015-03-13 279 2 2015-03-13 
100 2015-03-13 135 3 2015-03-13 
+0

ありがとうございました –

関連する問題