0

2 列のテーブルが与えられた場合

Name(type VARCHAR) Time(type DATETIME)

エントリ数が最大の時間を見つける SQL クエリを作成する必要があります。

例えば:

Name   Time 
----   ----
a     12:30pm
b     12:05pm
c     13:55pm
d     12:50pm
e     01:02am

望ましい結果は時間です: 午後 12 時 - 午後 1 時

私の一般的なアイデアは次のとおりです
。1)行を時間ごとにグループ化する
2)行/グループをカウントする
3)カウントを降順でソートする
4)最大カウントを出力する

これを SQL クエリに変換するのに助けが必要です。

4

2 に答える 2

3

これはかなり簡単です...

SELECT HOUR(Time) as Hr,COUNT(*) AS Cnt
FROM MyTable
GROUP BY Hour(Time)
ORDER BY Cnt DESC
LIMIT 1

GROUP BY Hour(Time)- 時間ごとにグループ化

ORDER BY Cnt DESC-これにより、カウントでソートされます(降順)

LIMIT 1- 上位の結果が 1 つだけ必要なため

于 2013-02-28T11:58:41.843 に答える
0

これは、私の理解ではあなたが探しているもののOracleバージョンです:

SELECT t_stamp
     , MAX(count(t_stamp)) OVER (PARTITION BY t_stamp ORDER BY t_stamp)  hits_per_hr_interval
  FROM
  (
  SELECT name, EXTRACT(hour From Cast(t_stamp as timestamp)) t_stamp
    FROM stack_test
  )
  GROUP BY t_stamp
  /

  T_STAMP    HITS_PER_HR_INTERVAL
  -------------------------------
  12          3
  13          2

または、row_number() を使用:

SELECT * FROM
(
 SELECT t_stamp
      , Count(t_stamp) OVER (PARTITION BY t_stamp ORDER BY t_stamp) hits_per_hr_interval 
      , ROW_NUMBER() OVER (PARTITION BY t_stamp ORDER BY t_stamp) hr_seq
   FROM
   (
   SELECT EXTRACT(hour From Cast(t_stamp as timestamp)) t_stamp
     FROM stack_test
   )
  )
  -- WHERE hr_seq = 1  -- optional to see only first row per group as in above example 
  /

 T_STAMP    HITS_PER_HR_INTERVAL    HR_SEQ
 ------------------------------------------
 12         3                       1
 12         3                       2
 12         3                       3
 13         2                       1
 13         2                       2

勤務時間が 12 時から 1 時までの場合など、さらにフィルターを追加できます...

于 2013-02-28T15:30:01.630 に答える