【问题标题】:SQL Order random rows based on 2 columnsSQL 根据 2 列对随机行进行排序
【发布时间】:2016-01-14 11:18:52
【问题描述】:

如何在Oracle9中对这个表进行排序:

START | END | VALUE
  A   |  F  |   1
  D   |  H  |   9
  F   |  C  |   8
  C   |  D  |  12

让它看起来像这样?:

START | END | VALUE
   A  |  F  |   1
   F  |  C  |  12
   C  |  D  |   8
   D  |  H  |   9

目标是从上一行开始每一行。

【问题讨论】:

  • SELECT * FROM table_name ORDER BY "value"?
  • 对不起,我的错。应该使用另一个值示例。将立即编辑它
  • 它总是像您显示的那样是一个链,还是可能有重复(两条记录具有相同的开始或结束)?可以有几行没有匹配的追随者吗?
  • 数据总是连续的吗?还是可能有差距?
  • START 和 END 之间永远不会有间隔。数据最终总会返回。这有点像一个圆圈。重复是不可能的,两条记录不能有相同的开始或结束

标签: sql sql-order-by oracle9i


【解决方案1】:

这不能单独使用 order by 子句来完成,因为它必须首先找到没有前任的记录,然后找到下一条记录比较两条记录的结束和开始列等。这是一个迭代过程你需要一个递归查询。

递归查询会找到第一条记录,然后是下一条,依此类推,给它们序列号。然后,您将使用结果并按这些生成的数字排序。

这里是如何在标准 SQL 中执行此操作。但是,这仅从 Oracle 11g 开始受支持。在 Oracle 9 中,您必须使用我不熟悉的 CONNECT BY。希望您或其他人可以为您转换查询:

with chain(startkey, endkey, value, pos) as
(
  select startkey, endkey, value, 1 as pos 
  from mytable
  where not exists (select * from mytable prev where prev.endkey = mytable.startkey)
  union all
  select mytable.startkey, mytable.endkey, mytable.value, chain.pos + 1 as pos 
  from chain 
  join mytable on mytable.startkey = chain.endkey
)
select startkey, endkey, value
from chain
order by pos;

更新:正如您所说的数据是循环的,您必须更改上述查询,以便从任意选择的行开始并在通过时停止:

with chain(startkey, endkey, value, pos) as
(
  select startkey, endkey, value, 1 as pos 
  from mytable
  where rownum = 1
  union all
  select mytable.startkey, mytable.endkey, mytable.value, chain.pos + 1 as pos 
  from chain 
  join mytable on mytable.startkey = chain.endkey
)
cycle startkey set cycle to 1 default 0
select startkey, endkey, value
from chain
where cycle = 0
order by pos;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多