powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Порядок сортировки значений в функции LIST
25 сообщений из 27, страница 1 из 2
Порядок сортировки значений в функции LIST
    #39866653
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли повлиять на порядок сортировки элементов, возвращаемых функцией LIST()?
В документе "Firebird_2_5_Language_Reference_RUS.pdf" сказано:

Порядок конкатенации строк определяется порядком чтения записей из источников, который
в общем случае не определён. Для придания списку необходимого порядка вы можете
предварительно упорядочить источник данных, например, с помощью производной таблицы.


А вот http://firebirdsql.su/doku.php?id=list&s%5B]=list]тут сказано:
Порядок элементов в списке определен реализацией, т.е. ORDER BY не влияет на результат.


Проверяю на версии 2.5.8 и склоняюсь к тому, что ORDER BY ни на что не влияет:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT q.UN_NUM, LIST(q.GSM_ID, ',')
FROM
   (SELECT un.UN_NUM, dg.GSM_ID
    FROM CARS c
    LEFT JOIN USERNUMBERS un ON un.OFC_ID=c.OFC_ID AND un.UN_USERID=c.CAR_ID AND un.UN_USERTYPE=1
    LEFT JOIN DEFGSM dg ON dg.UN_NUM=un.UN_NUM
    WHERE c.DEP_ID=:dep AND c.CAR_ISDELETE=0
    ORDER BY 1, 2 DESC) q
GROUP BY q.UN_NUM



Во внешнем запросе не учитывается ORDER BY, указанный во внутреннем запросе.

Мне на самом деле интересно знать следующее: гарантируется ли, что функция LIST сортирует данные в порядке возрастания?
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39866658
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

у меня всё верно написано. Ты не учитываешь, что GROUP BY тоже выполняется с помощью сортировки и может поломать порядок который возвращён из производной таблицы
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39866667
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И как же мне без GROUP BY запрос выполнить (чтоб не портился порядок сортировки)?
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39866682
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

Если GSM_ID уникальны в группе, то тебе поможет DISTINCT, наверное.
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39866742
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerИ как же мне без GROUP BY запрос выполнить (чтоб не портился порядок сортировки)?

Хранимка, execute block... В общем, ручная конкатенация.
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39867012
H.e.l.p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select UN.UN_NUM,
       (select list(Q.GSM_ID, ',')
        from (select distinct DG.GSM_ID
              from DEFGSM DG
              where DG.UN_NUM = UN.UN_NUM
              order by 1 desc) Q)
from CARS C
left join USERNUMBERS UN on UN.OFC_ID = C.OFC_ID and
      UN.UN_USERID = C.CAR_ID and
      UN.UN_USERTYPE = 1
where C.DEP_ID = :DEP and
      C.CAR_ISDELETE = 0
group by 1
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39867025
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H.e.l.p,

Что это за хрень? Не поможет.

Когда я писал "попробуй дистинкт", я имел в виду LIST(DISTINCT Q.GSM_ID, ','), а не это.
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39867029
H.e.l.p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

при чем тут то что ты писал?

Пусть ТС проверит, поможет или нет.
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39867030
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я и не заметил, что у ТС, похоже и так хранимка. Почему не воспользоваться for select...?
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39867046
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H.e.l.pWildSery,

при чем тут то что ты писал?

Пусть ТС проверит, поможет или нет.Заменить клавиатуру на жёлтую автору не хочешь предложить?
Пусть тоже проверит, поможет или нет.
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39867153
H.e.l.p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

ты хочешь сказать запрос не рабочий и вернет результат не так как хотел его видеть ТС?
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39867270
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H.e.l.pDmSer,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select UN.UN_NUM,
       (select list(Q.GSM_ID, ',')
        from (select distinct DG.GSM_ID
              from DEFGSM DG
              where DG.UN_NUM = UN.UN_NUM
              order by 1 desc) Q)
from CARS C
left join USERNUMBERS UN on UN.OFC_ID = C.OFC_ID and
      UN.UN_USERID = C.CAR_ID and
      UN.UN_USERTYPE = 1
where C.DEP_ID = :DEP and
      C.CAR_ISDELETE = 0
group by 1



Так работает!
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39867332
H.e.l.p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

Спасибо! А то некоторые слишком категоричны, в своих высказываниях...
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39867436
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H.e.l.pWildSery,

ты хочешь сказать запрос не рабочий и вернет результат не так как хотел его видеть ТС?Нет, я такого не говорил.
Запрос рабочий, только неэффективный, кореллирующий подзапрос может и ласты склеить на объёмах.
И кстати, зачем у тебя distinct? Это делает запрос не идентичным запросу автора. Ведь он так и не написал, уникален ли у него GSM_ID в пределах группы.

DmSerТак работает!Сегодня работает. С тем же успехом можно было вставить дистинкт в лист и не париться с подзапросами.
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39867466
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H.e.l.p,

у меня трёшка заругалась на group by. Без group by работает.
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39867506
sysdba22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По хорошему надо добавить WITHIN GROUP (ORDER BY...

https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017

может в Firebird 5?
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #39867513
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sysdba22По хорошему надо добавить WITHIN GROUP (ORDER BY...

https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017

может в Firebird 5?
Хорошо бы
Код: sql
1.
2.
LIST([ALL | DISTINCT] <expr> [, separator]) [FILTER (WHERE <condition>)]
 [OVER ([<partition_exp>])] [ASC|DESC [compare_function]]


где compare_function - функция сравнения, типа такой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
create function CMP (
    A integer,
    B integer)
returns boolean
as
begin
  return a > b;
end


:-)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Порядок сортировки значений в функции LIST
    #40121598
demon1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотелось бы еще раз прояснить работу сабжа.
Дано: процедура, в которой указан порядок сортировки, т.е. ordred by.
Так вот казалось бы, процедура, являясь источником данных, выдает уже отсортированный список и как указано в доках(Порядок конкатенации строк определяется порядком чтения записей из источников), должно было бы работать, но нет, не работает.
Хорошо, делаю конструкцию:
Код: sql
1.
2.
3.
4.
select list(fld)
from (select fld
         from stored_proc
         order by priority asc)


тоже не работает...
Если же написать конструкцию, типа:
Код: sql
1.
2.
3.
4.
select list(fld)
from (select list(fld) as fld
         from stored_proc
         group by priority asc)


то тогда уже все работает.
Вопрос, почему не работают два первых варианта?
Версия сервера 3.0.8.
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #40121601
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992,

начни с воспроизводимых примеров.

"Не работает" - не работает.
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #40121610
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992,

а ничего что 1 и 2 вариант совсем не эквивалентны?
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #40121612
demon1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,

distinct внутри list должен как то влиять на сортировку? Похоже дело в нем.
Пример сейчас посмотрю.
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #40121613
demon1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad
demon1992,

начни с воспроизводимых примеров.

"Не работает" - не работает.

Работает
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
execute block
returns (
    LST blob sub_type 1)
as
begin
  select list(TBL.NAME)
  from (select 'three' as NAME, 3 as ORDERING
        from RDB$DATABASE
        union
        select 'four' as NAME, 4 as ORDERING
        from RDB$DATABASE
        union
        select 'one' as NAME, 1 as ORDERING
        from RDB$DATABASE
        union
        select 'two' as NAME, 2 as ORDERING
        from RDB$DATABASE
        order by 2 asc) TBL
  into :LST;
  suspend;
end

one  ,two  ,three,four 
PLAN SORT (SORT (TBL RDB$DATABASE NATURAL, TBL RDB$DATABASE NATURAL, TBL RDB$DATABASE NATURAL, TBL RDB$DATABASE NATURAL))


Не работает
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
execute block
returns (
    LST blob sub_type 1)
as
begin
  select list(distinct TBL.NAME)
  from (select 'three' as NAME, 3 as ORDERING
        from RDB$DATABASE
        union
        select 'four' as NAME, 4 as ORDERING
        from RDB$DATABASE
        union
        select 'one' as NAME, 1 as ORDERING
        from RDB$DATABASE
        union
        select 'two' as NAME, 2 as ORDERING
        from RDB$DATABASE
        order by 2 asc) TBL
  into :LST;
  suspend;
end

four ,one  ,three,two  
PLAN SORT (SORT (TBL RDB$DATABASE NATURAL, TBL RDB$DATABASE NATURAL, TBL RDB$DATABASE NATURAL, TBL RDB$DATABASE NATURAL))

...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #40121614
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992,

distinct выполняет сортировку, так что противоречий с документацией нет. Если хочешь чтобы работало правильно вноси distinct в производную таблицу
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #40121619
demon1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Не нашел в документации описания, что distinct влияет на сортировку.
Во избежании офф топа, больше никаких пояснений мне не требуется, я все понял.
...
Рейтинг: 0 / 0
Порядок сортировки значений в функции LIST
    #40121631
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992,

с точки зрения SQL distinct не обязан делать сортировку.
Это просто особенность внутренней реализации примерно такая же как для GROUP BY
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Порядок сортировки значений в функции LIST
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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