powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Аналог keep(dense_rank
9 сообщений из 9, страница 1 из 1
Аналог keep(dense_rank
    #36982875
Есть ли в sqlite аналог ораклового max(...) keep(dense_rank ...)
То есть например есть таблица clstatus
поля
clientid, cldate, status
надо найти для каждого клиента его статус на определенную дату.
Можно написать типа

Код: plaintext
1.
2.
3.
4.
5.
select cleintid, status
from clstatus s
 inner join (select cleintid, max(cldate) cldate
               from clstatus
                 group by cleintid) st
    on s.cleintid=st.cleintid And s.cldate=st.cldate
В оракле это может выглядеть например так

Код: plaintext
1.
2.
3.
select cleintid, 
         max(status) keep(dense_rank last order by cldate) status
from clstatus 
group by cleintid
Есть ли аналог в лайт?
...
Рейтинг: 0 / 0
Аналог keep(dense_rank
    #36985007
Используй "бабушкин" трюк .
Работать будет на любой СУБД, имеющей в своем арсенале строковые функции и возможность агрегирования...
...
Рейтинг: 0 / 0
Аналог keep(dense_rank
    #36985333
Добрый Э - Эх, классный вариант, спасибо.
Осталось узнать как обстоят дела в лайт со строковыми функциями :)
...
Рейтинг: 0 / 0
Аналог keep(dense_rank
    #36985661
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТропотоногОсталось узнать как обстоят дела в лайт со строковыми функциями :)
Если нужной нет, то ее можно создать и зарегистрировать в SQLite.
Кстати, можно создать свои собственные агрегатные функции.
...
Рейтинг: 0 / 0
Аналог keep(dense_rank
    #36986249
По ходу дела выяснилось, что в лайт работает и такой вот запрос

Код: plaintext
1.
2.
3.
4.
select cleintid, 
         status,
         max(cldate)
from clstatus 
group by cleintid
То есть в mssql oracle вылетела бы ошибка что мол нет group by по status,
а тут нифига при этом он достает именно статус соответствующий max(cldate)...
...
Рейтинг: 0 / 0
Аналог keep(dense_rank
    #36988645
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievТропотоногОсталось узнать как обстоят дела в лайт со строковыми функциями :)
Если нужной нет, то ее можно создать и зарегистрировать в SQLite.
Кстати, можно создать свои собственные агрегатные функции.

о, как?
...
Рейтинг: 0 / 0
Аналог keep(dense_rank
    #36988680
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.sqlite.org/c3ref/create_function.html
авторThe seventh, eighth and ninth parameters, xFunc, xStep and xFinal, are pointers to C-language functions that implement the SQL function or aggregate. A scalar SQL function requires an implementation of the xFunc callback only; NULL pointers must be passed as the xStep and xFinal parameters. An aggregate SQL function requires an implementation of xStep and xFinal and NULL pointer must be passed for xFunc. To delete an existing SQL function or aggregate, pass NULL poiners for all three function callbacks.
...
Рейтинг: 0 / 0
Аналог keep(dense_rank
    #36992306
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Dmitry Arefiev http://www.sqlite.org/c3ref/create_function.html
авторThe seventh, eighth and ninth parameters, xFunc, xStep and xFinal, are pointers to C-language functions that implement the SQL function or aggregate. A scalar SQL function requires an implementation of the xFunc callback only; NULL pointers must be passed as the xStep and xFinal parameters. An aggregate SQL function requires an implementation of xStep and xFinal and NULL pointer must be passed for xFunc. To delete an existing SQL function or aggregate, pass NULL poiners for all three function callbacks.

С агрегатными функциями дело интересно обстоит - апстримом эскулайта разрабатывается биндинг tclsqlite, но в нем агрегаты создавать нельзя, хотя многие другие биндинги умеют. Позиция апстрима следующая - не надо вам агрегаты создавать. Когда-то я думал добавить сабж, а потом решил, что и в самом деле не надо...
...
Рейтинг: 0 / 0
Аналог keep(dense_rank
    #36992325
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
ТропотоногПо ходу дела выяснилось, что в лайт работает и такой вот запрос

Код: plaintext
1.
2.
3.
4.
select cleintid, 
         status,
         max(cldate)
from clstatus 
group by cleintid
То есть в mssql oracle вылетела бы ошибка что мол нет group by по status,
а тут нифига при этом он достает именно статус соответствующий max(cldate)...

Ошибаетесь.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table test (a,b,c);
insert into test values ( 1 , 1 , 1 );
insert into test values ( 2 , 2 , 2 );
insert into test values ( 3 , 3 , 3 );
insert into test values ( 1 , 2 , 3 );

select a,b,c from test group by a;
 1 | 2 | 3 
 2 | 2 | 2 
 3 | 3 | 3 

select a,min(b),c from test group by a;
 1 | 1 | 3 
 2 | 2 | 2 
 3 | 3 | 3 

В первой строке результатов последнего запроса, как видите, c=3, а не c=1, как вы ожидаете.

Вопрос "а почему оно работает и не надо ли убрать для совместимости" периодически задается в рассылке sqlite-users :-) И я сам придерживаюсь взгляда, что эта возможность необходима, примеры, где именно, в рассылку присылал. Вкратце - можно эмулировать отсутствующую конструкцию "distinct on" (для совместимости с постгресом, в частности). Но только осторожно, т.к. временами можно встать на грабли, особенно при смене версии эскулайт. Вот в качестве примера грабли, на которые я сам не очень давно встал:

http://www.mail-archive.com/sqlite-users@sqlite.org/msg56103.html]http://www.mail-archive.com/sqlite-users@sqlite.org/msg56103.html

Проблему можно обойти с помощью сортированного подзапроса, но без сильной на то необходимости лучше придерживаться рекомендованных путей:
http://www.mail-archive.com/sqlite-users@sqlite.org/msg56114.html]http://www.mail-archive.com/sqlite-users@sqlite.org/msg56114.html
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Аналог keep(dense_rank
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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