1

特定の月の毎日のラッシュ時間を取得するためのクエリを作成しようとしています。私が持っているテーブルは次のようになります。

id      idproduct       created_at
1       021354684       2011-10-01 20:25:48
2       033546835       2011-10-01 20:30:15
3       055965654       2011-10-01 20:45:20
4       012975343       2011-10-02 14:03:36
5       021354684       2011-10-02 15:55:48
6       033546835       2011-10-02 16:30:15
7       055965654       2011-10-02 16:45:20
8       012975343       2011-10-02 18:53:36
9       021354684       2011-10-03 08:55:48
10      033546835       2011-10-03 09:30:15
11      055965654       2011-10-03 14:03:20
12      012975343       2011-10-03 14:03:36

私が取得しようとしているのは、次のようなものです...:

day     rush_hour    number_of_rows
1       20:00        3
2       16:00        5
3       14:00        4

このようなテーブルを取得することは可能ですか? あなたたちは私を助けることができますか?

間違えました、すみません。行数は、その時間ではなく、その日に販売されたアイテムの合計でなければなりません:(すみません。

4

4 に答える 4

3

http://sqlfiddle.com/#!2/5b87b/7

まず、毎日の毎時間のカウントをカウントします (以下で 2 回使用するため、ビューに入れます)。

CREATE VIEW hours AS 
SELECT
  DATE( created_at ) AS d,
  HOUR( created_at ) AS h,
  COUNT(*) AS c
FROM item
GROUP BY DATE(created_at), HOUR(created_at);

最終クエリ:

SELECT
  hours.d AS `day`,
  hours.h AS `rush_hour`,
  hours.c AS `count`

-- get the max count for every day
FROM (
      SELECT
        d,          -- the day 
        MAX(c) as c -- the count
      FROM hours
      GROUP BY d
     ) AS maxc

-- find the actual hour(s) with the max count for every day:
INNER JOIN hours ON hours.c = maxc.c
                AND hours.d = maxc.d;
于 2012-06-29T20:39:53.817 に答える
2

MySQL Date Functionsを見たいと思うでしょう、彼らはあなたにこれに関するいくつかの助けを提供します

SELECT 
  day(created_at) as day, 
  hour(created_at) as rush_hour, 
  count(1) as num_rows 
FROM item
GROUP BY
  day(created_at), hour(created_at)

http://sqlfiddle.com/#!2/62a15/2/0

于 2012-06-29T20:34:25.893 に答える
0

ここにそれは見解を作らずにあります:

SELECT ddd.day, eee.rush_hour, ddd.maxo
FROM 
(select day, max(num_rows) as maxo from (
SELECT 
  day(created_at) as day, 
  hour(created_at) as rush_hour, 
  count(1) as num_rows 
FROM item
GROUP BY
  day(created_at), hour(created_at)
  ) as groupo group by day) as ddd

LEFT JOIN
(SELECT 
  day(created_at) as day, 
  hour(created_at) as rush_hour, 
  count(1) as num_rows 
FROM item
GROUP BY
  day(created_at), hour(created_at)
  ) as eee on ddd.day=eee.day and ddd.maxo=eee.num_rows

より適切にフォーマットされているか、より関連性の高いエイリアスがあることを想像できますが、ここでは非常に多くのサブ選択が行われています。

そして、そこにデータを置いてくれたSQLfiddlersに感謝します。

そして、数えているものの最大数に2時間結び付けられている場合、両方が表示されるので、その月のその日に2つ(またはそれ以上)のレコードが返されると思います。

于 2012-06-29T20:56:39.573 に答える
0

これを試して:

SELECT dayofyear(created_at) as day, hour(created_at) as rush_hour, count(*) as number_of_rows 
FROM table
GROUP BY dayofyear(created_at), hour(created_at);
于 2012-06-29T20:31:55.377 に答える