12

ユーザーごとに約 3000 行の MySQL テーブルがあります。列の 1 つは変更可能な日時フィールドであるため、行は時系列ではありません。

グラフで時間分布を視覚化したいので、多数の個別のデータポイントが必要です。20 個のデータポイントで十分です。

私はこれを行うことができます:

select timefield from entries where uid = ? order by timefield;

150行ごとに見てください。

または、20 個の個別のクエリを実行して、 and を使用することもできlimit 1ますoffset

しかし、もっと効率的な解決策があるはずです...

4

7 に答える 7

6

Michal Sznajder はほぼそれを実現しましたが、SQL の WHERE 句で列エイリアスを使用することはできません。したがって、派生テーブルとしてラップする必要があります。これを試したところ、20行が返されました:

SELECT * FROM (
    SELECT @rownum:=@rownum+1 AS rownum, e.*
    FROM (SELECT @rownum := 0) r, entries e) AS e2
WHERE uid = ? AND rownum % 150 = 0;
于 2008-10-01T01:49:27.897 に答える
1

こんなことが頭に浮かびました

select @rownum:=@rownum+1 rownum, entries.* 
from (select @rownum:=0) r, entries 
where uid = ? and rownum % 150 = 0

私はMySQLを手元に持っていませんが、これが役立つかもしれません...

于 2008-08-06T17:06:44.247 に答える
1

視覚化に関する限り、これはあなたが話している定期的なサンプリングではないことはわかっていますが、ユーザーのすべての行を見て、間隔バケット、バケット内の SUM を選択し、棒グラフなどに表示します。これは、時間枠内の多くの発生が重要な場合があるため、実際の「分布」を示します。

SELECT DATEADD(day, DATEDIFF(day, 0, timefield), 0) AS bucket -- choose an appropriate granularity (days used here)
     ,COUNT(*)
FROM entries
WHERE uid = ?
GROUP BY DATEADD(day, DATEDIFF(day, 0, timefield), 0)
ORDER BY DATEADD(day, DATEDIFF(day, 0, timefield), 0)

または、自分自身を繰り返さなければならない方法が気に入らない場合、またはさまざまなバケットで遊んでいて、多くのユーザーを 3-D で分析したい場合 (x、y uid、バケットに対して Z を測定):

SELECT uid
    ,bucket
    ,COUNT(*) AS measure
FROM (
    SELECT uid
        ,DATEADD(day, DATEDIFF(day, 0, timefield), 0) AS bucket
    FROM entries
) AS buckets
GROUP BY uid
    ,bucket
ORDER BY uid
    ,bucket

3 次元でプロットしたい場合は、おそらく、ユーザーにとって意味のある全体的なメトリックに従ってユーザーを並べ替える方法を決定するでしょう。

于 2008-10-01T02:07:33.347 に答える
0

@Michal

何らかの理由で、この例は、@recnumがより小さい演算子を使用している場合にのみ機能します。whereが行を除外すると、rownumはインクリメントされず、他の何にも一致しないと思います。

元のテーブルに自動インクリメントされたid列があり、行が時系列で挿入された場合、これは機能するはずです。

select timefield from entries
where uid = ? and id % 150 = 0 order by timefield;

もちろん、idとタイムフィールドの間に相関関係がない場合は機能しません。ただし、実際に等間隔のタイムフィールドを取得する必要がない場合は、ランダムなタイムフィールドが20個だけです。

于 2008-08-06T18:01:32.733 に答える
0

個々のデータポイントを本当に気にしますか? それとも、日付番号で統計集計関数を使用するだけで、知りたいことを十分に伝えることができますか?

于 2008-08-27T16:14:36.443 に答える
0
select timefield
from entries
where rand() = .01 --will return 1% of rows adjust as needed.

mysql の専門家ではないので、この環境で rand() がどのように動作するかわかりません。

于 2008-08-27T16:37:10.760 に答える