sql - Répartition du tableau dans le temps

Translate

J'ai une table MySQL avec environ 3000 lignes par utilisateur. L'une des colonnes est un champ datetime, qui est modifiable, donc les lignes ne sont pas dans l'ordre chronologique.

Je voudrais visualiser la distribution du temps dans un graphique, j'ai donc besoin d'un certain nombre de points de données individuels. 20 points de données suffiraient.

Je pourrais faire ceci:

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

et regardez tous les 150 rangs.

Ou je pourrais faire 20 requêtes distinctes et utiliserlimit 1etoffset.

Mais il doit y avoir une solution plus efficace ...

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

Toutes les réponses

Translate

Michal Sznajder l'a presque eu, mais vous ne pouvez pas utiliser d'alias de colonne dans une clause WHERE en SQL. Vous devez donc l'envelopper comme une table dérivée. J'ai essayé ceci et cela renvoie 20 lignes:

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;
La source
Translate

Quelque chose comme ça m'est venu à l'esprit

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

Je n'ai pas MySQL sous la main mais peut-être que cela aidera ...

La source
Translate

En ce qui concerne la visualisation, je sais que ce n'est pas l'échantillonnage périodique dont vous parlez, mais je regarderais toutes les lignes d'un utilisateur et choisirais un seau d'intervalle, SUM dans les seaux et le montrerais sur un graphique à barres ou similaire. Cela montrerait une véritable «distribution», car de nombreuses occurrences dans une période donnée peuvent être importantes.

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)

Ou si vous n'aimez pas la façon dont vous devez vous répéter - ou si vous jouez avec différents seaux et que vous souhaitez analyser de nombreux utilisateurs en 3D (mesurez en Z par rapport à x, y uid, seau):

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

Si je voulais tracer en 3-D, je déterminerais probablement un moyen d'ordonner les utilisateurs en fonction d'une métrique globale significative pour l'utilisateur.

La source
Translate

@Michal

Pour une raison quelconque, votre exemple ne fonctionne que lorsque le where @recnum utilise un opérateur inférieur à. Je pense que lorsque le where filtre une ligne, le rang ne s'incrémente pas et ne peut correspondre à rien d'autre.

Si la table d'origine a une colonne d'identifiant incrémentée automatiquement et que les lignes ont été insérées dans l'ordre chronologique, cela devrait fonctionner:

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

Bien sûr, cela ne fonctionne pas s'il n'y a pas de corrélation entre l'identifiant et le champ temporel, à moins que vous ne vous souciez pas d'obtenir des champs temporels uniformément espacés, juste 20 aléatoires.

La source
Translate

Vous souciez-vous vraiment des points de données individuels? Ou est-ce que l'utilisation des fonctions d'agrégation statistique sur le nombre de jours suffira à vous dire ce que vous souhaitez savoir?

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

Pas un expert mysql donc je ne suis pas sûr du fonctionnement de rand () dans cet environnement.

La source
Translate

Pour ma référence - et pour ceux qui utilisent postgres - Postgres 9.4 aura ordonné des agrégats d'ensemble qui devraient résoudre ce problème:

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

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

La source