Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Аналог keep(dense_rank / 9 сообщений из 9, страница 1 из 1
29.11.2010, 12:05
    #36982875
Аналог keep(dense_rank
Есть ли в 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
30.11.2010, 05:31
    #36985007
Аналог keep(dense_rank
Используй "бабушкин" трюк .
Работать будет на любой СУБД, имеющей в своем арсенале строковые функции и возможность агрегирования...
...
Рейтинг: 0 / 0
30.11.2010, 10:33
    #36985333
Аналог keep(dense_rank
Добрый Э - Эх, классный вариант, спасибо.
Осталось узнать как обстоят дела в лайт со строковыми функциями :)
...
Рейтинг: 0 / 0
30.11.2010, 12:21
    #36985661
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог keep(dense_rank
ТропотоногОсталось узнать как обстоят дела в лайт со строковыми функциями :)
Если нужной нет, то ее можно создать и зарегистрировать в SQLite.
Кстати, можно создать свои собственные агрегатные функции.
...
Рейтинг: 0 / 0
30.11.2010, 14:55
    #36986249
Аналог keep(dense_rank
По ходу дела выяснилось, что в лайт работает и такой вот запрос

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

о, как?
...
Рейтинг: 0 / 0
01.12.2010, 13:41
    #36988680
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог keep(dense_rank
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
02.12.2010, 23:51
    #36992306
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог keep(dense_rank
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
03.12.2010, 00:12
    #36992325
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог keep(dense_rank
ТропотоногПо ходу дела выяснилось, что в лайт работает и такой вот запрос

Код: 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
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Аналог keep(dense_rank / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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