0

現在、特定の日の特定のテーブルの上位 X 件の結果のリストがあります。「上位」は、集計数が最も多い結果として定義されています。私が見たいのは、その特定の日のカウントだけでなく、昨日のカウントとの比較、および先週のカウントの平均です。

これが私の現在のクエリです:

SELECT foo, bar, SUM(count) as today
FROM tablename
WHERE col1 = 'asdf' and date = '2012-08-23'
GROUP BY foo, bar
ORDER BY count desc
LIMIT 5

結果は次のようになります。

|foo        | bar        | today |
|something1 | something3 | 2345  |
|something2 | something4 | 1234  |
 ....

しかし、私が持ちたいのは次のようなものです:

|foo        | bar        | today | yesterday | week_avg |
|something1 | something3 | 2345  | 2273      | 2193     |
|something2 | something4 | 1234  | 935       | 1001     |
 ....

ボーナス ポイントとして、何らかの GROUP_CONCAT の結果で過去 20 日間のすべての日付を取得してもかまいません (そのため、スパークラインを簡単に作成できます)。

4

3 に答える 3

3

先週のすべての行を取得し、(CASEcountを介して)条件付き集計を使用して、当日のcount値と昨日の値のみを合計できます。

SELECT   foo, 
         bar,
         SUM(CASE WHEN date = CURDATE() THEN count ELSE 0 END) AS today,
         SUM(CASE WHEN date = CURDATE() - INTERVAL 1 DAY THEN count ELSE 0 END) AS yesterday,
         AVG(count) AS week_avg
FROM     tablename
WHERE    col1  = 'asdf' AND
         date >= CURDATE() - INTERVAL 1 WEEK
GROUP BY foo,
         bar
ORDER BY today DESC
LIMIT    5

最後に、今日のcount値の合計で並べ替え、その順序に基づいて上位5つを選択します。

于 2012-08-23T19:39:39.027 に答える
0

あなたの最初の質問。これを試して:

 SELECT day0.foo, day0.bar, 
        day0.addup as today, 
        day1.addup as yesterday, 
        week0.addup/7 as week_avg
   FROM 
  ( 
    SELECT foo, bar, SUM(count) as addup
      FROM tablename
     WHERE col1 = 'asdf'
       AND date >= CURDATE()
       AND date < CURDATE() + INTERVAL 1 DAY
  GROUP BY foo, bar
  ) day0
  JOIN ( 
    SELECT foo, bar, SUM(count) as addup
      FROM tablename
     WHERE col1 = 'asdf'
       AND date >= CURDATE() - INTERVAL 1 DAY
       AND date < CURDATE()
  GROUP BY foo, bar
  ) day1 ON (day0.foo = day1.foo AND day0.bar=day1.bar)
  JOIN ( 
    SELECT foo, bar, SUM(count) as addup
      FROM tablename
     WHERE col1 = 'asdf'
       AND date >= CURDATE() - INTERVAL 7 DAY
       AND date < CURDATE()
  GROUP BY foo, bar
  ) week0 ON (day0.foo = week0.foo AND day0.bar = week0.bar)
 ORDER BY day0.addup desc
    LIMIT 5

毛むくじゃらに見えますが、毎日1つずつ、3つの異なる要約クエリが結合されています。

2番目の質問:

SELECT foo, bar, GROUP_CONCAT(addup)
  FROM (
    SELECT foo, bar, 
           DATEDIFF(CURDATE(),date) AS daysago, 
           SUM(count) as addup
      FROM tablename
     WHERE col1 = 'asdf'
       AND date >= CURDATE() - INTERVAL 20 DAY
       AND date < CURDATE() )A
  GROUP BY foo, bar, date
  ORDER BY foo, bar, date
于 2012-08-23T19:39:56.423 に答える
0

日付とその日付の金額を使用してサマリー テーブルを準備したら、昨日との差を探していると仮定して、 を使用できますCOALESCE。以下のtbl表は、次のような要約表を示しています。

SELECT date, foo, bar, SUM(count) as today
FROM tablename
WHERE col1 = 'asdf'
GROUP BY date, foo, bar
ORDER BY count desc
LIMIT 5

クエリ

SELECT a.ddate, a.amount AS today, 
COALESCE(a.amount - 
  (SELECT b.amount 
   FROM tbl b 
   WHERE b.ddate = a.ddate - INTERVAL 1 DAY), a.amount) AS yesterday
FROM tbl a

フィドルを参照してください。

于 2012-08-23T19:36:00.013 に答える