Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Порядок сортировки значений в функции LIST / 25 сообщений из 27, страница 1 из 2
25.09.2019, 09:15
    #39866653
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок сортировки значений в функции LIST
Можно ли повлиять на порядок сортировки элементов, возвращаемых функцией 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
25.09.2019, 09:26
    #39866658
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок сортировки значений в функции LIST
DmSer,

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

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

Хранимка, execute block... В общем, ручная конкатенация.
...
Рейтинг: 0 / 0
25.09.2019, 17:22
    #39867012
H.e.l.p
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок сортировки значений в функции LIST
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
25.09.2019, 17:33
    #39867025
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок сортировки значений в функции LIST
H.e.l.p,

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

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

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

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

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

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

ты хочешь сказать запрос не рабочий и вернет результат не так как хотел его видеть ТС?
...
Рейтинг: 0 / 0
26.09.2019, 12:41
    #39867270
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок сортировки значений в функции LIST
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
26.09.2019, 14:28
    #39867332
H.e.l.p
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок сортировки значений в функции LIST
DmSer,

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

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

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

у меня трёшка заругалась на group by. Без group by работает.
...
Рейтинг: 0 / 0
26.09.2019, 19:06
    #39867506
sysdba22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок сортировки значений в функции LIST
По хорошему надо добавить 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
26.09.2019, 19:21
    #39867513
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок сортировки значений в функции LIST
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
Период между сообщениями больше года.
20.12.2021, 11:18
    #40121598
demon1992
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок сортировки значений в функции LIST
Хотелось бы еще раз прояснить работу сабжа.
Дано: процедура, в которой указан порядок сортировки, т.е. 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
20.12.2021, 11:40
    #40121601
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок сортировки значений в функции LIST
demon1992,

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

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

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

distinct внутри list должен как то влиять на сортировку? Похоже дело в нем.
Пример сейчас посмотрю.
...
Рейтинг: 0 / 0
20.12.2021, 12:18
    #40121613
demon1992
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок сортировки значений в функции LIST
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
20.12.2021, 12:33
    #40121614
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок сортировки значений в функции LIST
demon1992,

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

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

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


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