Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Возможна-ли группировка по хитрому условию? / 6 сообщений из 6, страница 1 из 1
20.09.2008, 20:04
    #35550505
phprus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна-ли группировка по хитрому условию?
Есть таблица в которой есть следующие три поля:
data
uid
timestamp - это поле имеет тип TIMESTAMP

Скажите пожалуйста, можно ли сделать группировку строк из этой таблицы по полям data, uid и по условию, чтобы в каждой группе нашлась как минимум 1 пара (если группировка по data, uid дала группу из одной строки, то эта строка должна попасть в результат без сравнения timestamp, так как его сравнивать просто не с чем) timestamp'ов между которыми прошло меньше, чем заданный промежуток времени? Если timestamp'ы отсортировать, то сравнивать расстояния придется только между соседними строками.

PostgreSQL версии 8.3.1.
...
Рейтинг: 0 / 0
22.09.2008, 05:19
    #35551285
Возможна-ли группировка по хитрому условию?
На SQL можно много чего сделать. Только нужно четко представлять себе задачу. По твоему описанию лично я не смог понять, чего же тебе требуется...
Приведи тестовый набор данных и тот результа, что на этих данных должен получиться.
...
Рейтинг: 0 / 0
22.09.2008, 13:40
    #35552031
бухарь
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна-ли группировка по хитрому условию?
Код: plaintext
GROUP BY CASE WHEN...ELSE...END
...
Рейтинг: 0 / 0
22.09.2008, 15:55
    #35552418
phprus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна-ли группировка по хитрому условию?
Пример того, что я хочу получить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
data  uid  timestamp
a       1       1999 - 01 - 08   04 : 02 : 00 
a       1       1999 - 01 - 08   04 : 05 : 00 
a       1       1999 - 01 - 08   04 : 06 : 00 

a       1       1999 - 01 - 08   04 : 55 : 00 

a       2       1999 - 01 - 08   04 : 05 : 00 

b       1       1999 - 01 - 08   05 : 05 : 00 

b       1       1999 - 01 - 08   06 : 05 : 00 

Как видно из примера в первой группе между timestamp'ами прошло менее Х минут. (Для примера пусть будет 5), по этому они должны быть сгруппированы. 4-я строчка не попала в первую группу, так как прошло более чем 5 минут.

> бухарь
А разве CASE позволит мне посмотреть предыдущие записи группы?
...
Рейтинг: 0 / 0
23.09.2008, 06:11
    #35553304
Возможна-ли группировка по хитрому условию?
phprusПример того, что я хочу получить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
data  uid  timestamp
a       1       1999 - 01 - 08   04 : 02 : 00 
a       1       1999 - 01 - 08   04 : 05 : 00 
a       1       1999 - 01 - 08   04 : 06 : 00 

a       1       1999 - 01 - 08   04 : 55 : 00 

a       2       1999 - 01 - 08   04 : 05 : 00 

b       1       1999 - 01 - 08   05 : 05 : 00 

b       1       1999 - 01 - 08   06 : 05 : 00 

Как видно из примера в первой группе между timestamp'ами прошло менее Х минут. (Для примера пусть будет 5), по этому они должны быть сгруппированы. 4-я строчка не попала в первую группу, так как прошло более чем 5 минут.


Давай я тебе приведу пример своей реализации, а ты уже сам решишь, насколько моё решение удовлетворяет твоим условиям.
В качестве упрощения понимания своего примера я буду использовать целочисленное значение вместо timestamp'а.
Пусть есть таблица T (num, data, id, dt) , где:
NUM - это просто нумератор УПОРЯДОЧЕННЫХ по DATA, ID, DT строк в таблице (то есть, нумерация строкам была присвоена после выполнения по таблице сортировки вида ORDER BY data, id, dt). Это фиктивное поле я ввел исключительно для того, чтобы было проще объяснять какая строка в какую группу попала.
DATA - это аналог твоего поля DATA. Соответственно смысловая нагрузка этого поля ровно такая, как и у тебя.
ID - это аналог твоего поля UID. Просто в моей СУБД слово UID является ключевым зарезервированным словом, поэтому его использование без двойных кавычек невозможно. А ставить везде двойные кавычки мне было лень. :) Смысловая нагрузка этого поля ровно такая, как и у тебя.
DT - это аналог твоего поля TIMESTAMP. В моей СУБД слово TIMESTAMP также является ключевым зарезервированным словом. Смысловая нагрузка этого поля ровно такая, как и у тебя, с той лишь разницей, что тип у неё integer (просто мне опять же было лень разбираться с арифметикой TIMESTAMP'ов в PostgreSQL).
В таблице есть такие данные:
Код: plaintext
select * from t
NUMDATAIDDT0q111q122q143q154q315q326q337q368z719z72

Предположим, что заданный интервал между DT у нас составляет 1. Тогда у нас должны получиться такие группы:
1-я группа, строки 0, 1
2-я группа, строки 2, 3
3-я группа, строки 4, 5, 6
4-я группа, строки 7
5-я группа, строки 8, 9

Если же между DT задать интервал, равный 2, то группы будут такими:
1-я группа, строки 0, 1, 2, 3
2-я группа, строки 4, 5, 6
3-я группа, строки 7
4-я группа, строки 8, 9

Если между DT задать интервал, равный 3, то группы будут такими:
1-я группа, строки 0, 1, 2, 3
4-я группа, строки 4, 5, 6, 7
3-я группа, строки 8, 9

Вот запрос, который делает такого рода разбиение на группы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select *
  from (
         select t0.*,
                (
                  select count(case when t2.id is null then  1  end)
                    from t t1
                    left join t t2
                      on t1.dt - t2.dt <= :DELTA -- вместо переменной привязки подставляем интересующий нас интервал
                     and t1.dt > t2.dt
                     and t1.data = t2.data
                     and t1.id = t2.id
                   where t1.data < t0.data
                      or t1.data = t0.data
                     and t1.id < t0.id
                      or t1.data = t0.data
                     and t1.id = t0.id
                     and t1.dt <= t0.dt
                ) as grp_id -- Идентификатор группы
           from t t0
       ) v

Если вместо :DELTA поочередно подставлять 1, 2, 3, то получим такого рода результаты:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 1 )
:DELTA =  1 

Query finished, retrieving results...

NUM   DATA   ID   DT   GRP_ID
---   ----   --   --   ------
   0    q        1      1          1 
   1    q        1      2          1 
   2    q        1      4          2 
   3    q        1      5          2 
   4    q        3      1          3 
   5    q        3      2          3 
   6    q        3      3          3 
   7    q        3      6          4 
   8    z        7      1          5 
   9    z        7      2          5 

 10  row(s) retrieved

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 2 )
:DELTA =  2 

Query finished, retrieving results...

NUM   DATA   ID   DT   GRP_ID
---   ----   --   --   ------
   0    q        1      1          1 
   1    q        1      2          1 
   2    q        1      4          1 
   3    q        1      5          1 
   4    q        3      1          2 
   5    q        3      2          2 
   6    q        3      3          2 
   7    q        3      6          3 
   8    z        7      1          4 
   9    z        7      2          4 

 10  row(s) retrieved

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 3 )
:DELTA =  3 

Query finished, retrieving results...

NUM   DATA   ID   DT   GRP_ID
---   ----   --   --   ------
   0    q        1      1          1 
   1    q        1      2          1 
   2    q        1      4          1 
   3    q        1      5          1 
   4    q        3      1          2 
   5    q        3      2          2 
   6    q        3      3          2 
   7    q        3      6          2 
   8    z        7      1          3 
   9    z        7      2          3 

 10  row(s) retrieved

З.Ы.
GRP_ID - это как раз то поле, кототое показывает принадлежность строки к той или иной группе.
...
Рейтинг: 0 / 0
23.09.2008, 13:22
    #35554161
phprus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна-ли группировка по хитрому условию?
Добрый Э - Эх
Судя по описанию это то, что мне нужно. Сейчас буду дальше разбираться.
Спасибо за помощь!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Возможна-ли группировка по хитрому условию? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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