Как перемешать ячейки столбца по вертикали с помощью sql? - PullRequest
0 голосов
/ 07 сентября 2018

Я использую sqlite с python. Предположим, у меня есть таблица данных, которая выглядит следующим образом:

Name   | Age
_______|____
Mike   | 12
Jack   | 45
Ben    | 37
Anne   | 19

Вопрос: Можно ли (используя sqlite) перетасовать столбцы по вертикали? Если да, то как? Я хочу, чтобы моя таблица данных выглядела примерно так (меня не волнует порядок, в котором ячейки в столбце "возраст" перетасовываются):

Name   | Age
_______|____
Mike   | 45
Jack   | 12
Ben    | 19
Anne   | 37

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Вы можете использовать ниже sql, просто замените имя таблицы в 2 местах в запросе ниже и посмотрите результат.

 select name, max ( age) age 
 from ( select name,  age from ( select name, null age  from temp_person  order by random() ) 
       union all 
        select name, age from ( select  name, age from temp_person order by random() )  )
 group by name
0 голосов
/ 07 сентября 2018

Поскольку ваша версия SQLite не поддерживает window function и CTE, поэтому вы можете попытаться создать временную таблицу для переноса ваших данных и ROWID и random().

Создайте randomRn основание столбца на random(), затем JOIN таблицу с ROWID и randomRn числом (случайный rowID)

Схема (SQLite v3.16)

CREATE TABLE T(
  Name VARCHAR(50),
  Age INT
);


INSERT INTO T VALUES ('Mike', 12);
INSERT INTO T VALUES ('Jack', 45);
INSERT INTO T VALUES ('Ben', 37);
INSERT INTO T VALUES ('Anne', 19);

CREATE TABLE temp1 
AS 
SELECT AGE,Name,ROWID,random() rn
FROM T

Запрос № 1

SELECT t1.Name name,t2.Age age
FROM temp1 t1 JOIN 
(
  SELECT *,(
    select count(*) 
    from temp1 tt
    where tt.rn >= t1.rn
  ) randomRn
  FROM temp1 t1
) t2 on t1.rowid = t2.randomRn;

| name | age |
| ---- | --- |
| Ben  | 12  |
| Anne | 45  |
| Mike | 37  |
| Jack | 19  |

Просмотр на БД Fiddle

Примечание

запомните DROP временную таблицу, когда вы закончите ее использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...