Чтобы избежать какого-либо недетерминизма, вы можете использовать рекурсивный CTE следующим образом:
sqlite> create table t3(pos,col1,col2);
sqlite> insert into t3 values(1,2,'B'),(2,1,'A'),(3,5,'E');
sqlite> select * from t3;
1|2|B
2|1|A
3|5|E
sqlite>
with
sorted(pos,c1,c2) as (
select row_number() over (order by t3.pos), -- sorting by first column's value
t3.col1, t3.col2
from t3
),
concat(pos,c1,c2) as (
select sorted.pos,sorted.c1,sorted.c2 -- starting with values for first position
from sorted
where sorted.pos=1
union all
select sorted.pos,
concat.c1||','||sorted.c1, -- adding next value from col1
concat.c2||','||sorted.c2 -- adding next value from col2
from concat
join sorted
on concat.pos+1 = sorted.pos -- going through subsequent positions
)
select c1, c2
from concat
order by pos desc
limit 1; -- order by desc limit 1 means 'take the row with largest number'
2,1,5|B,A,E
Хотя это решение довольно сложное, оно гарантирует правильную сортировку и может быть легко расширено за счет увеличения числа столбцов. Столбец заказа может содержать пробелы - sorted
CTE позаботится о том, чтобы сделать его в правильной целочисленной последовательности.
Обратите внимание, что row_number() over (order by...)
может потребоваться прилично свежая версия sqlite, которая поддерживает функции управления окнами.