37

基本的に、次のようなテーブルがあります。

time.....activities.....length  
13:00........3.............1  
13:15........2.............2  
13:00........3.............2  
13:30........1.............1  
13:45........2.............3  
13:15........5.............1  
13:45........1.............3  
13:15........3.............1  
13:45........3.............2  
13:45........1.............1  
13:15........3.............3  

いくつかのメモ:

  • アクティビティは 1 から 5 の間で指定できます
  • 長さは 1 から 3 の間で指定できます

クエリは次を返す必要があります。

time........count  
13:00.........2  
13:15.........2  
13:30.........0  
13:45.........1  

基本的に、一意の時間ごとに、アクティビティの値が 3 である行の数をカウントしたいと考えています。

だから私は言うことができます:

At 13:00 there were X amount of activity 3s.
At 13:45 there were Y amount of activity 3s.

次に、アクティビティ 1 秒、2 秒、4 秒、5 秒のカウントが必要です。そのため、一意の時間ごとに分布をプロットできます。

4

4 に答える 4

63

はい、使用できますGROUP BY

SELECT time,
       activities,
       COUNT(*)
FROM table
GROUP BY time, activities;
于 2012-11-05T16:19:35.073 に答える
13
select time, coalesce(count(case when activities = 3 then 1 end), 0) as count
from MyTable
group by time

SQL フィドルの例

出力:

|  TIME | COUNT |
-----------------
| 13:00 |     2 |
| 13:15 |     2 |
| 13:30 |     0 |
| 13:45 |     1 |

1 つのクエリですべてのアクティビティをカウントする場合は、次のようにします。

select time, 
    coalesce(count(case when activities = 1 then 1 end), 0) as count1,
    coalesce(count(case when activities = 2 then 1 end), 0) as count2,
    coalesce(count(case when activities = 3 then 1 end), 0) as count3,
    coalesce(count(case when activities = 4 then 1 end), 0) as count4,
    coalesce(count(case when activities = 5 then 1 end), 0) as count5
from MyTable
group by time

アクティビティによるグループ化に対するこの利点は、その時間セグメントにそのタイプのアクティビティがない場合でもカウント 0 を返すことです。

もちろん、これはどのタイプのアクティビティもない時間セグメントの行を返しません。それが必要な場合は、考えられるすべての時間セグメントをリストするテーブルとの左結合を使用する必要があります。

于 2012-11-05T16:18:51.423 に答える
5

私があなたの質問を理解していれば、これはうまくいきますか? (実際の列とテーブル名に置き換える必要があります)

SELECT time_col, COUNT(time_col) As Count
FROM time_table
GROUP BY time_col
WHERE activity_col = 3
于 2012-11-05T16:18:04.803 に答える