【问题标题】:How to shuffle column cells vertically with sql?如何用sql垂直打乱列单元格?
【发布时间】:2019-02-12 14:24:00
【问题描述】:

我在 python 中使用 sqlite。假设我有一个如下所示的数据表:

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

问题:是否可以(使用 sqlite)垂直打乱列?如果是这样,怎么做?我希望我的数据表看起来像这样(我不关心“年龄”列中的单元格被打乱的顺序):

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

【问题讨论】:

  • 结果集中shuffled 是什么意思?
  • @D-Shih 感谢您的回复!我想改变“年龄”列w.r.t的顺序。 “名称”列。换句话说:我想根据“年龄”列中的年龄将年龄重新分配给名称。
  • 随机或随机有什么逻辑吗?
  • @D-Shih 这对我来说不重要,所以都可以!
  • 你的sqlite版本是什么,支持CTE还是window函数?

标签: sql python-3.x sqlite


【解决方案1】:

由于你的SQLite版本不支持window functionCTE,所以你可以尝试创建一个临时表来承载你的数据和ROWIDrandom()

基于random() 创建一个randomRn 列,然后通过ROWIDrandomRn 编号(随机rowID)创建JOIN

架构 (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  |

View on DB Fiddle

注意

当你用完临时表时记住DROP

【讨论】:

    【解决方案2】:

    您可以使用下面的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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多