非常に複雑なグループby / sique / rimit by sql-command
質問
私は実際にこれを呼ぶ方法さえ知らない:P、しかし...
私は1つのテーブルを持っています、それを「アップロード」と呼びましょう
id owner date
-----------------------------
0 foo 20100101120000
1 bar 20100101120300
2 foo 20100101120400
3 bar 20100101120600
.. .. ..
6 foo 20100101120800
今、私が次のようなことをするとき:
SELECT id FROM uploads ORDER BY date DESC
これは次のようになります。
id owner date
-----------------------------
6 foo 20100101120800
.. .. ..
3 bar 20100101120600
2 foo 20100101120400
1 bar 20100101120300
0 foo 20100101120000
質問: いいですが、さらに進みたいです。なぜなら、あなたがタイムラインを構築するとき(そして私がした:P)、あなたはfooとbarが何かをアップロードしたというメッセージによって「スパム」されているからです。私はそれらをグループ化し、最初の結果を日付フィールドで「500」のタイムミットで返したいと思っています。
どのようなSQL-Commandが必要ですか?
id owner date
-----------------------------
6 foo 20100101120800
3 bar 20100101120600
0 foo 20100101120000
その後、各レコードに対して呼び出しを実行して、5分間の時間枠で連想レコードを取得できます(これはID = 6のエクスマプルです):
SELECT id FROM uploads WHERE date>=20100101120800-500 ORDER BY date DESC
誰かが今、私が最初のステップをすべきであるべきですか? (したがって、結果を制限/グループ化)
(ところで、私はこれを使用したいとき、私はすべての日付(ymdhis = 60)をunix-time(= 100)に変換する必要があることを知っていますが、私は必要ありません 5分 ちょうど5分であるために、それらは時々1分少ないかもしれません...)
解決
あなたの例があっても、あなたが得ようとしている結果は明確ではありません。おそらく、丸みを帯びているものとグループがあります。
SELECT max(id) max_id,owner, (ROUND(date/500)*500) date_interval, max(date) date
FROM uploads GROUP BY date_interval,owner
必要なものに応じて、丸い代わりに床または天井を使用することをお勧めします。
他のヒント
標準のSQLは間隔をあまりうまく処理しません。さまざまなタプルの日付を比較するには、テーブルの自己結合を行う必要があります。そうすれば、日付が500以下のタプルのすべてのペアを簡単に見つけることができます。ただし、セットの日付を500を超えないようにしたいのですが、私の知る限り、SQLで表現することはできません。
あなたができることは非常に似ていることです:合計時間間隔を固定500ユニット範囲に分割し、次にそれらが入っている間隔に基づいてテーブル内のすべてのタプルをクラスターすることです。そのために、最初にテーブルまたはクエリの結果が必要です間隔の開始時間。これは、テーブルのSQLクエリと、その間隔の開始時間までタイムスタンプを「丸め」、間隔シーケンス番号を計算する関数を使用して作成できます。次に、2番目のステップとして、その結果とともにテーブルに参加して、対応する開始時間に応じてタイムスタンプをグループ化できます。 DBMS依存であるため、SQLを提供することはできません。これがあなたの状況であなたが望むものを達成する最良の方法であるかどうかは確かにわかりません。
インラインビューを使用しますか?例:
SELECT u1.*
FROM uploads u1,
(SELECT date
FROM uploads u2
WHERE u2.owner='foo') datum_points
WHERE u1.date BETWEEN datum_points.date
AND DATE_ADD(datum_points.date INTERVAL 5 MINUTES)
「foo」を作成してから5分以内に作成されたすべての投稿を返却する必要があります。