Распределение таблицы времени

голоса
9

У меня есть таблица MySQL с приблизительно 3000 строк для каждого пользователя. Один из столбцов является полем даты и времени, который является изменяемым, поэтому строки не в хронологическом порядке.

Я хотел бы, чтобы визуализировать распределение времени в графике, так что мне нужно несколько отдельных точек данных. 20 точки данных будет достаточно.

Я мог бы сделать это:

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

и смотреть на каждый 150-й строке.

Или я мог бы сделать 20 отдельных запросов и использование limit 1и offset.

Но должно быть более эффективным решением ...

Задан 06/08/2008 в 17:58
источник пользователем
На других языках...                            


7 ответов

голоса
4

Михал 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;
Ответил 01/10/2008 в 02:49
источник пользователем

голоса
1

Насколько визуализации, я знаю, что это не периодический отбор проб вы говорите, но я хотел бы посмотреть на все строки для пользователя и выбрать интервал ведро, SUM в ведрах и показать на гистограмме или аналогичный. Это покажет реальное «распределение», так как многие случаи в пределах временного интервала могут быть значительными.

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)

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

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, я бы, вероятно, определить способ заказа пользователей в соответствии с какой-то значимой общей метрики для пользователя.

Ответил 01/10/2008 в 03:07
источник пользователем

голоса
1

Нечто подобное пришло в голову

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

У меня нет MySQL на моей руке, но, возможно, это поможет ...

Ответил 06/08/2008 в 18:06
источник пользователем

голоса
0

Для моей ссылки - и для тех, кто использует Postgres - 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/

Ответил 27/02/2014 в 12:36
источник пользователем

голоса
0
select timefield
from entries
where rand() = .01 --will return 1% of rows adjust as needed.

Не эксперт MySQL, так что я не знаю, как рэнд () работает в этой среде.

Ответил 27/08/2008 в 17:37
источник пользователем

голоса
0

Вы действительно заботитесь об отдельных точках данных? Или с использованием статистических агрегатных функций от числа дней, а не достаточно, чтобы сказать вам, что вы хотите знать?

Ответил 27/08/2008 в 17:14
источник пользователем

голоса
0

@Michal

По какой-то причине, ваш пример работает только тогда, когда где @recnum использует меньше, чем оператор. Я думаю, что, когда, где отфильтровывает строки, то ROWNUM не получает приращение, и он не может ничего другого совпадают.

Если исходная таблица имеет автоматическое приращение столбец ID и строки были вставлены в хронологическом порядке, то это должно работать:

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

Конечно, это не работает, если нет корреляции между идентификатором и TIMEFIELD, если вы на самом деле не заботиться о том, чтобы равномерно разнесенных timefields, всего 20 случайных из них.

Ответил 06/08/2008 в 19:01
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more