0

次のようなテーブルがあります。

ID  t_stamp         views uviews hits uhits
1   7/18/2012 19:00 105   11     0    0
5   7/18/2012 20:00 1     1      0    0
2   7/19/2012 9:00  118   4      0    0
1   7/19/2012 10:00 196   18     0    0
7   7/19/2012 11:00 2     1      0    0
2   7/19/2012 12:00 38    11     0    0
2   7/19/2012 13:00 20    5      0    0
2   7/19/2012 19:00 9     2      0    0
2   7/20/2012 15:00 85    6      0    0
1   7/20/2012 16:00 483   101    2    2
2   7/20/2012 17:00 1200  240    0    0
2   7/20/2012 18:00 1200  232    0    0
2   7/20/2012 19:00 1199  231    0    0
2   7/20/2012 20:00 1200  236    0    0
2   7/20/2012 21:00 1201  237    0    0
1   7/20/2012 22:00 1220  187    0    0
1   7/20/2012 23:00 869   165    0    0

そして、私の方法は、それらを日ごとに組み合わせて、最後の 4 つの列のそれぞれについて SUM を取得できるようにすることです。ID は特に重要ではありません。

私はこれを使用しています:

SELECT `bannerID` , DATE_FORMAT( `t_stamp` , '%m/%d/%Y' ) AS `date` ,
SUM( `views` ) AS `views` , SUM( `uviews` ) AS `uviews` , SUM( `hits` ) AS `hits` , SUM( `uhits` ) AS `uhits`
FROM test_bannerstats
WHERE DATE( t_stamp ) >= DATE( '2012-07-01' )
AND DATE( t_stamp ) <= DATE( '2012-08-24' )
GROUP BY `date`
ORDER BY `date` ASC

しかし、数字が矛盾しているように見えるので、それは私には正しくないようです。最後に、最後の4列を毎日集計したいと思います。

編集:

見た目の時差の問題です!その理由をお見せします...

上の表を見て、1 日分の足し算をしましょう...

1   07/18/2012  106     12    0     0
1   07/19/2012  383     41    0     0
1   07/20/2012  8657    1635  2     2

上は正しいです。下は間違っています。

1   07/18/2012  105     11    0     0
1   07/19/2012  384     42    0     0
1   07/20/2012  4167    810   2     2

問題?20時以降は翌日扱いです。私が整理しなければならないのはタイムゾーンの問題です。

4

4 に答える 4

0

SQLクエリは実際には機能しないと思います.7月1日から8月24日までの日付にのみ適用されます.最後の4つの日付がその日付を超えている場合はどうなりますか? 何も拾わない。

私の意見では、これを行う最良の方法は次のとおりです。

  SELECT SUM(column_name) FROM table_name order by id DESC limit 4;

Order by ID des は、結果を降順で並べ替えます。Limit 4 は、最初の 4 つの結果のみを取得します。

それが役立つことを願っています。

于 2012-08-24T07:09:19.220 に答える
0

これを試して、

SELECT  DATE_FORMAT(DATE(t_stamp), '%m/%d/%Y') AS `date`,
        SUM(views) totalViews,
        SUM(uviews) totalUViews,
        SUM(hits) totalHits,
        SUM(uhits) totalUHits,
FROM    tableName
WHERE   DATE( t_stamp ) >= DATE( '2012-07-01' ) AND 
            DATE( t_stamp ) <= DATE( '2012-08-24' )
GROUP BY DATE(t_stamp)
ORDER BY `date` ASC
于 2012-08-24T06:58:31.160 に答える
0

クエリは次のように簡略化できます。

SELECT `bannerID`,
        DATE_FORMAT( `t_stamp` , '%m/%d/%Y' ) AS `date`,
        SUM( `views` ) AS `views`,
        SUM( `uviews` ) AS `uviews`,
        SUM( `hits` ) AS `hits`,
        SUM( `uhits` ) AS `uhits`
FROM    test_bannerstats
WHERE   DATE( t_stamp ) BETWEEN '2012-07-01' AND '2012-08-24'
GROUP BY DATE(t_stamp)
ORDER BY DATE(t_stamp) ASC;
于 2012-08-24T06:59:20.087 に答える
0
  • インデックスを使用する機会を与えたい場合は、できる限り列で関数を使用しないでください。条件を置き換えます。

    WHERE DATE( t_stamp ) >= DATE( '2012-07-01' )
      AND DATE( t_stamp ) <= DATE( '2012-08-24' )`
    

    と:

    WHERE t_stamp >= DATE( '2012-07-01' )
      AND t_stamp < DATE( '2012-08-25' )
    
  • リストでエイリアスdateを定義しSELECTます。このエイリアスはWHEREorGROUP BY句では使用できません (正直に言うと、GROUP BY 句で使用できますが、お勧めしません)。それ以外の:

    GROUP BY `date`
    

    使用する:

    GROUP BY DATE(t_stamp)
    
  • とが同じ式で実行されるSELECT場合、使用可能な独自の MySQL 構文があります (ドキュメントで読むことができます)。それ以外の:GROUP BYORDER BY

    GROUP BY DATE(t_stamp)
    ORDER BY DATE(t_stamp) ASC;
    

    使用できます(わずかな効率向上のために):

    GROUP BY DATE( t_stamp ) ASC ;
    

クエリは次のようになります。

SELECT 
    bannerID
  , DATE_FORMAT( DATE( t_stamp ), '%m/%d/%Y' ) AS `date` 
  , SUM( views ) AS views
  , SUM( uviews ) AS uviews
  , SUM( hits ) AS hits
  , SUM( uhits ) AS uhits
FROM 
    test_bannerstats
WHERE 
    t_stamp >= DATE( '2012-07-01' )
  AND 
    t_stamp < DATE( '2012-08-25' )     --- notice the `<` and the +1 date offset
GROUP BY
    DATE( t_stamp ) ASC ;
于 2012-08-24T07:06:04.123 に答える