от
У меня есть таблица MySQL с примерно 3000 строк для каждого пользователя. Один из столбцов-поле datetime, который является изменяемым, так что строки не в хронологическом порядке. Я бы хотел, чтобы визуализировать распределение времени на диаграмме, так что мне нужен ряд отдельных точек данных. 20 точек данных будет достаточно. Я мог бы сделать это:
select timefield from entries where uid = ? order by timefield;
и посмотреть на каждый 150-й строке. Или я могу сделать 20 отдельных запросов и использовать
limit 1
и
offset
. Но там должно быть более эффективное решение...

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.

7 Ответы

0 голосов
от
Михал Sznajder почти получилось, но вы не можете использовать псевдонимы столбцов в предложении where в SQL. Так что вы должны обернуть его в качестве производной таблицы. Я попытался это и он возвращает 20 строк:
SELECT * FROM (
    SELECT @rownum:=@rownum 1 AS rownum, e.*
    FROM (SELECT @rownum := 0) r, entries e) AS e2
WHERE uid = ? AND rownum % 150 = 0;
0 голосов
от
Что-то вроде этого пришло мне в голову
select @rownum:=@rownum 1 rownum, entries.* 
from (select @rownum:=0) r, entries 
where uid = ? and rownum % 150 = 0
У меня нет MySQL в моей руке, но может это поможет ...
0 голосов
от
Насколько визуализации, я знаю, что это не периодический отбор проб о которых вы говорите, но я хотел бы посмотреть на все строки для пользователя и выбрать интервал ведро, сумма в ведра и показать гистограмму или похожие. Это показало бы реальную "раздачу", так как многие случаи в сроки, могут быть значительными.
SELECT DATEADD(day, DATEDIFF(day, 0, timefield), 0) AS bucket 

Или если вам не нравится, вам придется повторить себя - или, если вы играете с разных ведер и для анализа многих пользователей в 3-D (расстояние по оси Z от X и y, жидкости, ковш):

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
Если бы я хотел, чтобы сюжет в 3-D, Я бы, вероятно, определить способ, для того чтобы пользователи по некоторым значимым общая метрика для пользователей.
0 голосов
от
@Михал По какой-то причине, ваш пример работает только тогда, когда где @recnum использует меньше чем оператор. Я думаю, что, когда, где отфильтровывает строки, строки rownum не увеличивается, и она может не соответствовать что-нибудь еще. Если исходная таблица имеет автоматическое приращение столбца ID и строки были вставлены в хронологическом порядке, то это должно работать:
select timefield from entries
where uid = ? and id % 150 = 0 order by timefield;
Конечно это не сработает если нет корреляции между ИД и timefield, если вы на самом деле не заботятся о том, чтобы равномерно времени, всего 20 случайных.
0 голосов
от
Вы действительно заботитесь об отдельных точек данных? Или используя статистические агрегатные функции на число дней, а не достаточно, чтобы сказать вам, что вы хотите знать? СР STDDEV_POP Разница TO_DAYS
0 голосов
от
select timefield
from entries
where rand() = .01 

Не эксперт в MySQL, поэтому я не уверен, как слчис() работает в этой среде.
0 голосов
от
Для моя ссылка - и для тех, кто использует сервер - СУБД 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/
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...