Какая статистика может сохраняться для ряда числовых данных без итерации?

Поскольку автор не был достаточно любезен, чтобы дать SQL для создания схемы, здесь он предназначен для всех, кто хочет попробовать решение из @Eric.

create table markdetails (studid, subjectid, marks);
create table student_info (studid, name);

insert into markdetails values('A1', 3, 50);
insert into markdetails values('A1', 4, 60);
insert into markdetails values('A1', 5, 70);
insert into markdetails values('B1', 3, 60);
insert into markdetails values('B1', 4, 80);
insert into markdetails values('C1', 5, 95);

insert into student_info values('A1', 'Raam');
insert into student_info values('B1', 'Vivek');
insert into student_info values('C1', 'Alex');

Вот альтернативное решение с использованием case с group by.

select
    si.studid,
    si.name,
    sum(case when md.subjectid = 3 then md.marks end) subjectid_3,
    sum(case when md.subjectid = 4 then md.marks end) subjectid_4,
    sum(case when md.subjectid = 5 then md.marks end) subjectid_5
from student_info si
join markdetails md on
        md.studid = si.studid
group by si.studid, si.name
;

Для сравнения, вот то же утверждение select из решения @ Eric:

select
    u.stuid,
    u.name,
    s3.marks as subjectid_3,
    s4.marks as subjectid_4,
    s5.marks as subjectid_5
from
    student_info u
    left outer join markdetails s3 on
        u.stuid = s3.stuid
        and s3.subjectid = 3
    left outer join markdetails s4 on
        u.stuid = s4.stuid
        and s4.subjectid = 4
    left outer join markdetails s5 on
        u.stuid = s5.stuid
        and s5.subjectid = 5
;

Будет интересно посмотреть, какой из них будет работать лучше при большом количестве данных. .

8
задан Dan Tao 15 June 2010 в 01:26
поделиться

8 ответов

Во-первых, вам нужен термин онлайн-алгоритм . Все моменты (среднее, стандартное отклонение, перекос и т. Д.) Можно рассчитать в режиме онлайн. Остальные включают минимум и максимум. Обратите внимание, что медиана и режим не могут быть рассчитаны онлайн.

14
ответ дан 5 December 2019 в 07:35
поделиться

Чтобы постоянно поддерживать высокий / низкий уровень, вы храните свои данные в отсортированном порядке. Существуют алгоритмы для поддержки структур данных, которые сохраняют порядок.

Медиана тривиальна, если данные упорядочены.

Если данные немного сокращаются до частотной таблицы, вы можете поддерживать режим. Если вы храните данные в виде случайного плоского списка значений, вы не сможете легко вычислить режим при наличии изменений.

3
ответ дан 5 December 2019 в 07:35
поделиться

Могут быть полезны ответы на этот вопрос об онлайн-алгоритмах. Что касается удобства использования для ваших нужд, я бы сказал, что, хотя некоторые онлайн-алгоритмы могут использоваться для оценки сводной статистики с частичными данными, другие могут использоваться для их сохранения из потока данных, как вам нравится.

Вы также можете захотеть посмотреть на сложную обработку событий (или CEP), которая используется для отслеживания и анализа данных в реальном времени, например, в финансах или интернет-торговле. Единственный известный мне бесплатный продукт CEP - это Esper .

2
ответ дан 5 December 2019 в 07:35
поделиться

Как Джейсон говорит , вы действительно описываете онлайн-алгоритм. Я также видел этот тип вычислений, называемый Accumulator Pattern , независимо от того, реализован ли цикл явно или рекурсией.

1
ответ дан 5 December 2019 в 07:35
поделиться

Не совсем прямой ответ на ваш вопрос, но для многих статистических данных, которые не являются онлайн-статистикой, вы обычно можете найти некоторые правила для вычисления с помощью итераций только часть времени и кешировать правильное значение остальное время. Возможно, этого достаточно для вас?

Для высокого значения, например:

public void Add(double value) {
    values.Add(value);
    if (value > highValue)
        highValue = value;
}

public void Remove(double value) {
    values.Remove(value);
    if (value.WithinTolerance(highValue))
        highValue = RecalculateHighValueByIteration();
}
1
ответ дан 5 December 2019 в 07:35
поделиться

Невозможно поддерживать высокий или низкий уровень с помощью операций добавления и удаления с постоянным временем, потому что это даст Вы используете алгоритм сортировки в линейном времени. Вы можете использовать дерево поиска для сохранения данных в отсортированном порядке, что дает вам логарифмический минимум и максимум времени. Если вы также сохраняете размеры поддеревьев и их количество, также легко найти и медиану.

И если вы просто хотите поддерживать высокий или низкий уровень в присутствии добавлений и удалений, изучите очереди приоритетов,

1
ответ дан 5 December 2019 в 07:35
поделиться

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

0
ответ дан 5 December 2019 в 07:35
поделиться

It does sound (even after your 2nd edit) that you are describing on-line algorithms, with the additional requirement that you want to allow "delete" operations. An example of this are the "sketch algorithms" used for finding frequent items in a stream.

0
ответ дан 5 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: