0

user_id、date_time、amountを含む「transactions」という経費テーブルがあります。

私がやろうとしているのは、週番号/月に基づいてuser_idでグループ化されたsum(amount)をクエリすることです。例:

1)1週間の支出トップ10ユーザー、たとえば22または10

2)たとえば、3か月目の支出上位10ユーザー

私はサイトを調べましたが、同様のSQLの例がありますが、それらは主に7日間のスライディングウィンドウまたは「先週」または「先月」に基づいています。私はまだMySQLドキュメントを使用してそれを理解できるかどうかを確認しようとしていますが、時間を節約できるポインタがあれば幸いです。

ありがとうございました!

PS私はRails3を使用していますが、フレームワークにはこのための組み込みメソッドがあるのでしょうか?基本的なファインダーはしません...

後で編集:

これが機能することを期待していましたが、今週のデータも含まれています。

SELECT user_id,  sum(amount) AS t
 FROM transactions
 WHERE YEARWEEK(date_time) = YEARWEEK(now() - interval 1 week) 
group by user_id
4

1 に答える 1

3

次の解決策は正しい方向にあなたを導くはずです。これらのソリューションは、フィールドに設定したインデックスの使用も維持します(日付の比較は関数内にラップされた列ではなくdate_time、裸の列で行われるため、クエリは引数可能のままです)。date_timedate_time

-- Top 10 users by transaction amount for 3rd month of the year
SELECT   user_id, 
         SUM(amount) AS t
FROM     transactions
WHERE    date_time >= STR_TO_DATE(CONCAT(YEAR(NOW()), '-03-01'), '%Y-%m-%d') AND
         date_time <  STR_TO_DATE(CONCAT(YEAR(NOW()), '-03-01'), '%Y-%m-%d') + INTERVAL 1 MONTH
GROUP BY user_id
ORDER BY t DESC
LIMIT    10

^ここでは、その年の3か月目(または3月)に発生したユーザーによるトランザクションの合計を取得しています。03のオカレンスを、合計を取得する年のどの月に置き換えます。


-- Top 10 users by transaction amount for 20th week of the year
SELECT   user_id,
         SUM(amount) AS t
FROM     transactions
WHERE    date_time >= MAKEDATE(YEAR(NOW()), 7-(DAYOFWEEK(MAKEDATE(YEAR(NOW()), 7))-1)) +
                      INTERVAL 20     WEEK AND
         date_time <  MAKEDATE(YEAR(NOW()), 7-(DAYOFWEEK(MAKEDATE(YEAR(NOW()), 7))-1)) +
                      INTERVAL 20 + 1 WEEK
GROUP BY user_id
ORDER BY t DESC
LIMIT    10

^このソリューションは一見不格好に見えるかもしれませんが、実行しているのはYEARWEEK()、列をあらゆる種類の関数ラップの外側に保つように関数をエミュレートするdate_timeことです(前述のようにインデックスを利用できます)。

20のオカレンスを、合計を取得する年のどの週に置き換えます。

于 2012-08-19T13:08:07.167 に答える