sql - Verteilung der Tabelle in der Zeit

Translate

Ich habe eine MySQL-Tabelle mit ungefähr 3000 Zeilen pro Benutzer. Eine der Spalten ist ein Datum / Uhrzeit-Feld, das veränderbar ist, sodass die Zeilen nicht in chronologischer Reihenfolge aufgeführt sind.

Ich möchte die Zeitverteilung in einem Diagramm visualisieren, daher benötige ich eine Reihe einzelner Datenpunkte. 20 Datenpunkte würden ausreichen.

Ich könnte das tun:

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

und schauen Sie sich jede 150. Reihe an.

Oder ich könnte 20 separate Abfragen durchführen und verwendenlimit 1undoffset.

Aber es muss eine effizientere Lösung geben ...

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Michal Sznajder hatte es fast geschafft, aber Sie können keine Spaltenaliasnamen in einer WHERE-Klausel in SQL verwenden. Sie müssen es also als abgeleitete Tabelle umschließen. Ich habe es versucht und es gibt 20 Zeilen zurück:

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;
Quelle
Translate

So etwas kam mir in den Sinn

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

Ich habe MySQL nicht zur Hand, aber vielleicht hilft das ...

Quelle
Translate

In Bezug auf die Visualisierung weiß ich, dass dies nicht die periodische Stichprobe ist, von der Sie sprechen, aber ich würde alle Zeilen für einen Benutzer betrachten und einen Intervall-Bucket, eine SUMME innerhalb der Buckets auswählen und in einem Balkendiagramm oder ähnlichem anzeigen. Dies würde eine echte "Verteilung" zeigen, da viele Vorkommen innerhalb eines Zeitrahmens signifikant sein können.

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)

Oder wenn Ihnen die Art und Weise, wie Sie sich wiederholen müssen, nicht gefällt - oder wenn Sie mit verschiedenen Buckets spielen und in 3D viele Benutzer analysieren möchten (messen Sie in Z gegen x, y uid, Bucket):

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

Wenn ich in 3D zeichnen wollte, würde ich wahrscheinlich einen Weg finden, Benutzer nach einer für den Benutzer aussagekräftigen Gesamtmetrik zu ordnen.

Quelle
Translate

@ Michael

Aus irgendeinem Grund funktioniert Ihr Beispiel nur, wenn where @recnum einen Operator kleiner als verwendet. Ich denke, wenn das Where eine Zeile herausfiltert, wird das Rownum nicht erhöht und kann mit nichts anderem übereinstimmen.

Wenn die ursprüngliche Tabelle eine automatisch inkrementierte ID-Spalte enthält und Zeilen in chronologischer Reihenfolge eingefügt wurden, sollte dies funktionieren:

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

Das funktioniert natürlich nicht, wenn es keine Korrelation zwischen der ID und dem Zeitfeld gibt, es sei denn, Sie kümmern sich nicht darum, gleichmäßig verteilte Zeitfelder zu erhalten, sondern nur 20 zufällige.

Quelle
Translate

Interessieren Sie sich wirklich für die einzelnen Datenpunkte? Oder reicht es aus, stattdessen die statistischen Aggregatfunktionen für die Tageszahl zu verwenden, um Ihnen mitzuteilen, was Sie wissen möchten?

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

Ich bin kein MySQL-Experte, daher bin ich mir nicht sicher, wie rand () in dieser Umgebung funktioniert.

Quelle
Translate

Als Referenz - und für diejenigen, die Postgres verwenden - hat Postgres 9.4 Set-Aggregate bestellt, die dieses Problem lösen sollen:

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

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

Quelle