2008-08-06 5 views
11

私は約3000行のユーザを持つMySQLテーブルを持っています。列の1つはdatetimeフィールドです。このフィールドは変更可能です。したがって、行は時間順ではありません。時間内のテーブルの分布

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

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

を、すべての150番目の行を見て:

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

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

しかし、より効率的なソリューションが存在しなければならない...このような

+0

あなたが質問がもう少し説明することができますか?探している出力は何ですか?フリークエンシーチャート(例:Jan = 132、Feb = 112、Mar = 173などのエントリ数)、または最も早いエントリー、150番目の最も早いエントリー、300番目のエントリー、等? – nickf

答えて

6

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

SELECT * FROM (
    SELECT @rownum:[email protected]+1 AS rownum, e.* 
    FROM (SELECT @rownum := 0) r, entries e) AS e2 
WHERE uid = ? AND rownum % 150 = 0; 
1

何かが、私は私の手でMySQLを持っていませんが、多分これは役立つ私の心

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

に来ました...何らかの理由で

0

@Michal

どこ@recnumがオペレータ未満を使用する場合、あなたの例にのみ機能します。私はどこで行をフィルタリングするとき、rownumは増加しないと思うし、それは他のものとマッチすることはできません。元のテーブルが自動インクリメントid列を有し、列が順に挿入された場合

、これは動作するはず:IDとの相関がない場合

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

動作しないことあなたが実際に均等に間隔を置いた時間フィールドを得ることに気をつけない限り、時間フィールドは20のランダムなものになります。

0

個々のデータポイントは本当に気になりますか?または、曜日の統計集計関数を使用して、あなたが知りたいことを教えてもらえますか?

0
select timefield 
from entries 
where rand() = .01 --will return 1% of rows adjust as needed. 

ないようにMySQLの専門家私はどのようにランド(わからない)この環境で動作します。

+0

"rand()<.01" – nickf

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に対するZのメジャー、yのUIDに多くのユーザー間で分析したい場合、バケット):私は3-Dにプロットしたい場合は、私はおそらく利用者のためのいくつかの意味の全体的な評価指標に応じて、ユーザーを注文する方法を決定するであろう

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 

。私の参考のために

+0

"GROUP BYバケットORDER BYバケット"を実行できますか? (それは毎回その列を再計算する必要はありません) – nickf

+0

しかし、オプティマイザは関数が確定的であることを知っているので、実際にはそれらの式を実際に再計算しません。 –

0

- とはpostgresを使用して、それらのための - Postgresの9.4は、この問題を解決する必要があり、設定された凝集体を注文しています:

SELECT percentile_disc(0.95) 
WITHIN GROUP (ORDER BY response_time) 
FROM pageviews; 

出典:http://www.craigkerstiens.com/2014/02/02/Examining-PostgreSQL-9.4/