【问题标题】:merge TWO results of SQL select合并 SQL select 的两个结果
【发布时间】:2020-03-31 10:10:20
【问题描述】:

同一个mysql表中有两种数据。

某些数据的特定列设置为“1”,另一个数据的列设置为“0”(0 和 1 在同一列中)

我怎样才能像下面这样一次混合它们? (带选择查询)- 每六个“0”行后跟一个“1”行。

【问题讨论】:

  • 大约有 40 列。上面提到的特定列的名称是“wr_1”。它是 1 或 0。我想选择它们而不会错过任何行,
  • 为什么data8会出现两次?为什么结果集中的第一个块只有 5 个 0? data7 发生了什么?请将示例数据和预期结果作为文本添加到问题中。
  • 抱歉重复数据。我只想获取数据。 00000010000001这样的方式
  • 我认为您正在寻找 UNION。有了这个,您可以编写 2 个查询(相同数量/类型的列)并将结果放在一起
  • 是的,我认为现在 UNION 无关紧要。我想用 SELECT 得到它们

标签: mysql sql database sql-order-by


【解决方案1】:

好吧,您可以使用窗口函数进行排序 - 如果您运行的是 MySQL 8.0:

select code, val
from mytable
order by
    row_number() over(partition by val order by code) 
        * (case when val = 0 then 1 else 5 end),
    val,
    code

逻辑是对具有相同值的记录进行排名;然后可以使用简单的算法来处理交替(5 0s,然后是 1 1)。

Demo on DB Fiddle:

代码 |值 :----- | --: 数据1 | 0 数据10 | 0 数据11 | 0 数据12 | 0 数据13 | 0 数据2 | 1 数据14 | 0 数据15 | 0 数据3 | 0 数据4 | 0 数据5 | 0 数据8 | 1 数据6 | 0 数据7 | 0 数据9 | 0

【讨论】:

  • 非常感谢,但是mysql版本是5.x,列数是40左右,会不会有问题?
【解决方案2】:

我会这样说:

order by ( floor(row_number() over (partition by column order by data) - 1) /
                 (case when column = 1 then 1 else 5 end)
                )
         ),
         column,
         data

【讨论】:

  • 我无法列出整列,但大约有 40 列,我希望它们包含在结果中
  • @SangjunNa 。 . . .这只是order by。您可以在上面使用select t.* from t -- 或任何其他查询。
  • 谢谢,但仍然存在(mysql)版本问题...我的不支持“over”功能。有办法吗?
猜你喜欢
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2010-11-24
  • 2012-11-14
相关资源
最近更新 更多