powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Показать ранг в группе
10 сообщений из 10, страница 1 из 1
Показать ранг в группе
    #39248383
armak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, очень нужна помощь с подробным описанием, как сделать ранг по нескольким группам в таблице.

Есть таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create table t1 (
 id        integer primary key,
 date      date not null,
 race_id   integer null, 
 dog_id    integer null
);
insert into t1 values ( 1, '2016-01-03', 1421211, 458399);
insert into t1 values ( 2, '2016-01-01', 1421223, 458399);
insert into t1 values ( 3, '2016-01-01', 1421212, 458399);
insert into t1 values ( 4, '2016-01-06', 1421211, 472835);
insert into t1 values ( 5, '2016-01-04', 1421223, 472835);
insert into t1 values ( 6, '2016-01-04', 1421221, 472835);
insert into t1 values ( 7, '2016-01-07', 1421221, 478296);
insert into t1 values ( 8, '2016-01-07', 1421210, 478296);
insert into t1 values ( 9, '2016-01-07', 1421210, 478296);
insert into t1 values ( 10, '2016-01-12', 1421210, 480544);
insert into t1 values ( 11, '2016-01-11', 1421212, 480544);
insert into t1 values ( 12, '2016-01-10', 1421213, 480544);
insert into t1 values ( 13, '2016-01-15', 1421211, 482402);
insert into t1 values ( 14, '2016-01-12', 1421213, 482402);
insert into t1 values ( 15, '2016-01-12', 1421212, 482402);
insert into t1 values ( 16, '2016-01-16', 1421223, 490858);
insert into t1 values ( 17, '2016-01-16', 1421213, 490858);



Нужно получить в итоге порядковый номер (по убыванию даты) рейса собаки,
чтоб получить вот такой итог (приложен в файле)
...
Рейтинг: 0 / 0
Показать ранг в группе
    #39248408
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрим на строки с id 2 и 3. Почему у них "ранг" 2 и 3, а не 3 и 2?
Аналогичный вопрос про id 7, 8 и 9...

В один запрос вопросы транспонирования не решаются.
Сделай вторую таблицу с полем "ранг", скопируй туда строки из первой таблицы и установи для всех строк поле ранг=0.
А потом просто в цикле...
Код: sql
1.
2.
3.
4.
5.
update t2 set rang=1 where id in (select id from t2 group by dog_id having date=max(date)) 
update t2 set rang=2 where id in (select id from t2 where rang=0 group by dog_id having date=max(date)) 
update t2 set rang=3 where id in (select id from t2 where rang=0 group by dog_id having date=max(date)) 
update t2 set rang=4 where id in (select id from t2 where rang=0 group by dog_id having date=max(date)) 
....
...
Рейтинг: 0 / 0
Показать ранг в группе
    #39248558
armak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl, Спасибо за замечание, изменил фото.

Спасибо за решение, но у меня вопрос, если моя таблица будет включать в себя 4 000 000 строк, и там рангов может быть более 100 по каждой из групп.
Как это может повлиять на быстродействие? И коректно использовать ваш способ?
...
Рейтинг: 0 / 0
Показать ранг в группе
    #39248560
armak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Показать ранг в группе
    #39248588
armak,

Как вариант:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select (
         select count(1)
           from t1 t2
          where t1.dog_id = t2.dog_id
            and (
                     t1.date < t2.date
                     or
                     t1.date = t2.date
                 and t1.id <= t2.id
                )
       ) as dens_rank
     , t1.*
  from t1
 order by dog_id, date desc, id desc
...
Рейтинг: 0 / 0
Показать ранг в группе
    #39248589
White OwlВ один запрос вопросы транспонирования не решаются.если не секрет, где ты в постановке задачи ТС увидел транспонирование?
...
Рейтинг: 0 / 0
Показать ранг в группе
    #39248607
armak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,
Скажите, а таблица t2 - это дублированная таблица t1?
...
Рейтинг: 0 / 0
Показать ранг в группе
    #39248610
armak,

это - не дублированная таблица. это - та же самая таблица.
если что, в запросе к таблице, как источнику данных, можно обращаться более одного раза, просто нужно для каждого обращения задать свой алиас (псевдоним). никаких дубликатов таблиц в базе в этом случае создавать не нужно. при выполнении же запроса сервер дважды будет обращаться к одной и той же таблице. в данном случае - t2 как раз и есть алиас на таблицу t1, что видно из синтаксиса запрос: from t1 t2 (дословно: из t1, присвоив ей имя t2)
...
Рейтинг: 0 / 0
Показать ранг в группе
    #39248727
armak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,
Спасибо огромное за помощь, всё теперь работает, как часы!
...
Рейтинг: 0 / 0
Показать ранг в группе
    #39249423
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхWhite OwlВ один запрос вопросы транспонирования не решаются.если не секрет, где ты в постановке задачи ТС увидел транспонирование?ээээ.... не знаю :) Хотя нет, знаю. Подобная задача является промежуточным звеном для транспонирования, вот меня и потянуло дальше.
И да, твое решение лучше.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Показать ранг в группе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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