Vra

Ek het 'n MySQL tabel met ongeveer 3000 rye per gebruiker. Een van die kolomme is 'n date time veld, wat is wispelturig, so die rye is nie in chronologiese volgorde.

Ek wil graag die tyd verspreiding in 'n grafiek te visualiseer, so ek het 'n aantal individuele datapunte. 20 datapunte sou genoeg wees.

Ek kan dit doen:

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

en kyk na elke 150 ry.

Of ek kon doen 20 afsonderlike navrae en gebruik limit 1 en offset.

Maar moet daar 'n meer doeltreffende oplossing wees ...

Was dit nuttig?

Oplossing

Michal Sznajder het dit byna, maar jy kan dit nie gebruik kolom aliasse in 'n WHERE klousule in SQL. So moet jy dit draai as 'n afgeleide tafel. Ek het probeer om hierdie en dit terug 20 rye:

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

Ander wenke

Iets soos hierdie kom myns insiens

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

Ek het nie 'MySQL uit my hand, maar miskien sal dit help ...

Sover visualisering, ek weet dit is nie die periodieke monsterneming jy praat nie, maar ek sou kyk na al die rye vir 'n gebruiker en kies 'n interval emmer, som binne die emmers en wys op 'n staafgrafiek of soortgelyke . Dit sou 'n ware "verspreiding" wys, aangesien baie gebeurtenisse binne 'n tydraamwerk beduidende mag wees.

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)

Of as jy hou nie van die manier waarop jy jouself herhaal - of as jy speel met verskillende emmers en wil analiseer oor baie gebruikers in 3-D (maatstaf in Z teen x, y uid, emmer):

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

As ek wou plot in 3-D, ek sou waarskynlik 'n manier om gebruikers te bestel volgens sommige betekenisvolle algehele metrieke vir die gebruiker te bepaal.

@Michal

Vir een of ander rede, jou voorbeeld werk net vir die waar @recnum gebruik 'n minder as operateur. Ek dink wanneer die waar filters uit 'n ry, het die ROWNUM nie ontslae geïnkrementeer, en dit kan nie ooreen met enige iets anders.

As die oorspronklike tafel het 'n motor geïnkrementeer id kolom, en in chronologiese volgorde is rye ingevoeg, dan is dit moet werk:

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

Natuurlik wat nie werk as daar geen korrelasie tussen die id en die timefield, tensy jy nie eintlik omgee oor die manier waarop eweredig timefields, net 20 ewekansige kinders.

Wil jy regtig omgee vir die individu datapunte? Of sal met behulp van die statistiese gemiddelde funksies op die dag nommer in plaas voldoende om jou te vertel wat jy wil weet?

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

Nie 'n mysql deskundige so ek is nie seker hoe rand () bedryf in hierdie omgewing.

Vir my verwysing - en vir diegene wat met behulp postgres - Postgres 9.4 sal beveel het stel gemiddeldes wat hierdie probleem op te los:

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

Bron: http://www.craigkerstiens.com/ 2014/02/02 / Ondersoek-PostgreSQL-9.4 /

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top