Answer-ID
  • Întrebări
  • Tag-uri
  • Categorii
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
Michiel  de Mare
Michiel de Mare

Distribuția mesei în timp

Am un tabel MySQL cu aproximativ 3000 de rânduri pe utilizator. Una dintre coloane este un câmp datetime, care este mutabil, deci rândurile nu sunt în ordine cronologică.

Aș dori să vizualizez distribuția de timp într-o diagramă, așa că am nevoie de un număr de puncte de date individuale. 20 de date ar fi de ajuns.

Am putea face acest lucru:

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

și priviți la fiecare rândul al 150-lea.

Sau aș putea să fac 20 de interogări separate și să folosesc limit 1 și offset .

Dar trebuie să existe o soluție mai eficientă ...

12 2008-08-06T16:58:34+00:00 7
Programare
sql
mysql
Comentarii la întrebare (0)
Michal Sznajder
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#3691

Ceva de genul asta mi-a venit în minte

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

Nu am MySQL la mână, dar poate că asta îți va ajuta ...

0
0
Comentarii (0)
Ryan Ahearn
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#3775

@Michal

Din orice motiv, exemplul dvs. funcționează numai în cazul în care @recnum utilizează un operator mai puțin decât un operator. Cred că atunci când locul unde filtrează un rând, rownum-ul nu crește și nu se poate potrivi cu altceva.

Dacă tabela originală are o coloană ID incrementată automat și rândurile au fost inserate în ordine cronologică, atunci ar trebui să funcționeze:

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

Bineînțeles că nu funcționează dacă nu există o corelație între id și intervalul de timp, cu excepția cazului în care nu vă interesează de fapt obținerea unor câmpuri de timp uniforme, doar 20 aleatoare.

0
0
Comentarii (0)
Scott Noyes
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#30562

Îți pasă de punctele de date individuale? Sau va folosi funcțiile agregate statistice pe numărul de zi suficient pentru a vă spune ce vreți să știți?

  • AVG
  • STDDEV_POP
  • VARIANȚĂ
  • 0
    0
    Comentarii (0)
jason saldo
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#30600
select timefield
from entries
where rand() = .01 --will return 1% of rows adjust as needed.

Nu este un expert mysql, deci nu sunt sigur cum rand () funcționează în acest mediu.

0
0
Comentarii (0)
Bill Karwin
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#155901

Michal Sznajder a avut aproape acest lucru, dar nu puteți folosi aliasuri de coloane într-o clauză WHERE din SQL. Deci trebuie să-l înfășurați ca o masă derivată. Am incercat si am intors 20 randuri:

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;
0
0
Comentarii (0)
Cade Roux
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#155951

În ceea ce privește vizualizarea, știu că nu e vorba de eșantionarea periodică despre care vorbești, dar aș uita la toate rândurile pentru un utilizator și aleg o gaură de interval, SUM în galeți și arăta pe un grafar sau ceva asemănător. Aceasta ar arăta o "distribuție" reală, deoarece multe evenimente în cadrul unui interval de timp pot fi semnificative.

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)

Sau dacă nu vă place modul în care trebuie să vă repetați - sau dacă jucați cu diferite găleți și doriți să analizați pe mai mulți utilizatori în 3-D (măsurați în Z contra x, y uid, găleată):

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

Dacă am vrut să complot în 3-D, probabil aș determina o modalitate de a comanda utilizatorii în funcție de o anumită valoare globală semnificativă pentru utilizator.

0
0
Comentarii (0)
Michiel de Mare
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#22067305

Pentru referința mea - și pentru cei care utilizează postgres - Postgres 9.4 va fi comandat seturi de agregate care ar trebui să rezolve această problemă:

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

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

0
0
Comentarii (0)
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
ID
KO
RU
© Answer-ID 2021
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire