Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм представления данных / 10 сообщений из 10, страница 1 из 1
06.01.2007, 15:12
    #34239338
postuser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм представления данных
Подскажите, плз, простой алгоритм разворачивания данных, выдаваемых SQL-запросом. Пример:
Код: plaintext
1.
2.
3.
4.
клиент  1   2006 - 01 - 01    5  шт
клиент  1   2006 - 01 - 02    4  шт
клиент  1   2006 - 01 - 03    52  шт
клиент  2   2006 - 01 - 02    3  шт
клиент  2   2006 - 01 - 03    5  шт

Отобразить нужно так:
Код: plaintext
1.
2.
                2006 - 01 - 01                2006 - 01 - 02       2006 - 01 - 03 
клиент  1              5                      4                     52 
клиент  2             нет                   3                     5 
Причем даты могут быть пропущены, начинаться с разных чисел. Данные отсортированы по клиентам, но можно и др сортировку применить.
...
Рейтинг: 0 / 0
09.01.2007, 10:59
    #34242133
^ozzy^
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм представления данных
Пример запроса и структуру таблицы приведите.
...
Рейтинг: 0 / 0
09.01.2007, 13:16
    #34242666
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм представления данных
postuserПодскажите, плз, простой алгоритм разворачивания данных, выдаваемых SQL-запросом.
Хм. Чертовски рад встретить разумную мысль и правильный подход там, где большинство придумывает весьма... неудачные решения.

Итак, прежде всего, то, что Вы хотите сделать, называется "отобразить данные в виде кросс-таблицы". Это популярная задача, для решения которой есть множество инструментов, поэтому прежде всего имеет смысл поискать готовые решения для вашей области. Скажем, Microsoft Access как говорят, поддерживает такую операцию на уровне встроенного SQL.

Далее, вопрос в том, какие инструменты у Вас есть и насколько тяжелую задачу Вы решаете. Скажем, "просто распихать данные", опираясь на что-нибудь типа дельфового TStringGrid (таблица, помнящая собственные данные) - весьма тривиально: проход по датасету, ищем либо вставляем нужные строку-колонку, запоминаем значение в ячейке. "Ищем либо вставляем" - обычная операция вставки в сортируемый список. С другой стороны, если Вы хотите написать полноценный инструмент OLAP, в первую очередь следует пропахать литературу на тему удобного хранения этих данных в памяти; их потребуется разместить так, чтобы быстро выполнялись доступ и свертки по различным наборам измерений. Это уже не форумного формата вещь, да и литературы не так много.
...
Рейтинг: 0 / 0
09.01.2007, 18:17
    #34243794
postuser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм представления данных
СУБД - PostgreSQL 8.1.4 (планирую перейти на 8.2). ОС - Linux. Программа cgi - на Си, в крайнем случае php (но, думаю, разницы большой нет, так как отсутствуют всякие визуальные компоненты как в Delphi).
Структура таблицы:
table_traf
1. вх трафик
2. исх. трафик
3. дата (timestamp или date)
4. клиент
Сильно широкой задачи нет. Желательно обеспечить возможность сортировки клиентов по трафику за каждый день (кто в этот день скачал больше всего и по убывающей).
Сейчас разворачиваю данные на основе смены идентификатора клиента (данные в запросе отсортированы по клиенту, пока идентификатор предыдущий и последующий не меняется заполняю массив с индексом день, как только идю меняется вывожу предыдущий массив и записываю следующий итд), что не дает возможность сортировать по трафику. Да и не красиво как-то. Возникают проблемы когда запись на клиента всего одна (нет предыдущей и последующей).
Есть ли возможность отображения в виде кросс-таблицы в Postgres?
...
Рейтинг: 0 / 0
09.01.2007, 18:37
    #34243838
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм представления данных
Насчет возможностей Postgres не в курсе, это вопрос для соответствующего форума.

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

Повторюсь: в первую очередь стоит думать о структуре данных, адекватной операциям. Скажем, предположим, задача: вывести данные в кросс-таблицу, при клике на одну из дат сортировать по траффику за эту дату. Таким образом, структура данных должна решать две задачи: вернуть значение по двум координатам (для отображения в таблице) и вернуть список клиентов-значений на указанную дату (для сортировки).

Итого, получаем примерно следующее: класс, который содержит вектор дат, вектор клиентов и в какой-то форме список кортежей [дата,клиент,траффик]. Подойдет любая структура, хоть что-нибудь с map-ами, хоть просто список, отсортированный по дате, главное, чтобы в нем можно было эффективно найти данные за указанное число.

При инициализации датасет перекладывается в список кортежей, при этом также заполняются вектора координат. Если сортировать датасет по дате, все получается совсем просто. Вектор дат по датам и сортируется, вектор клиентов - как требует задача. Изначально, быть может, по именам.

Для построения таблицы код просто бежит в двойном цикле по векторам координат, запрашивает значение и рисует. Для клика - запрашивает диапазон кортежей на дату, сортирует их по траффику, соответственно переупорядочивает вектор клиентов, не забывая про тех, у кого нет записи на эту дату, и перерисовывает таблицу.
...
Рейтинг: 0 / 0
11.01.2007, 16:42
    #34249522
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм представления данных
Код: plaintext
select ClientName, sum(if(tdate='2006-01-01',traf, 0 )) from tbl group by ClientName;
как-то так, не проверял. Сумм ставь столько сколько надо.
...
Рейтинг: 0 / 0
11.01.2007, 16:44
    #34249535
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм представления данных
maXmoкак-то так, не проверял.
При заранее неизвестном списке дат?
...
Рейтинг: 0 / 0
11.01.2007, 16:56
    #34249587
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм представления данных
думаю, автор справится и без этого замечания.
...
Рейтинг: 0 / 0
16.01.2007, 11:49
    #34258103
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм представления данных
Обсуждалась более простая задача с заранее известным списком столбцов.

http://sql.ru/forum/actualthread.aspx?tid=190031
...
Рейтинг: 0 / 0
17.01.2007, 09:27
    #34260499
postuser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм представления данных
LeXa NalBatОбсуждалась более простая задача с заранее известным списком столбцов.

http://sql.ru/forum/actualthread.aspx?tid=190031
Спасибо за ссылку.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм представления данных / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]