【问题标题】:Oracle SQL Grouping/OrderingOracle SQL 分组/排序
【发布时间】:2014-05-20 07:22:25
【问题描述】:

我正在寻找一些帮助来编写 Oracle SQL 语句以完成以下任务...

假设我有以下数据:

YEAR | PLACE
1984 | somewhere
1983 | work
1985 | somewhere
1982 | home
1984 | work
1983 | home
1984 | somewhere

如何获得将所有 PLACE 列值保持在一起并按 YEAR 列排序的结果...所以我正在寻找的结果是:

YEAR | PLACE
1982 | home
1983 | home
1983 | work
1984 | work
1984 | somewhere
1984 | somewhere
1985 | somewhere

谢谢。

编辑:

只是为了说明一些问题的答案......假设我将以下数据添加到我的原始数据中:

1981 | somewhere

现在结果应该是:

YEAR | PLACE
1981 | somewhere
1984 | somewhere
1984 | somewhere
1985 | somewhere
1982 | home
1983 | home
1983 | work
1984 | work

谢谢。

【问题讨论】:

  • 为什么“工作”行在“家”和“某处”之间排序?这意味着您希望 place 按字母顺序以外的其他内容进行排序——该方法是什么?
  • 如果你也有1982 | somewhere怎么办?
  • 看来他只是想按年份排序。
  • 选择年份,按年份从 my_table 组中放置;
  • 艾伦,我相信这适用于大多数 SQL 服务器,但在我正在处理的 Oracle 服务器上,我收到以下错误:'不是 GROUP BY 表达式'......我相信只有 Oracle允许在某些情况下使用 GROUP BY ...因此我的问题:)

标签: sql oracle group-by sql-order-by


【解决方案1】:

基于 OPs cmets 修订:

select a.year, a.place
from my_table a join
  (select place, min(year) as min_year from my_table group by place) b on a.place = b.place
order by b.min_year, a.place, a.year

【讨论】:

  • 不幸的是,PLACE 列有数百个可能的值。
  • 好吧,你关心place 的实际顺序是什么,还是只是它们被组合在一起?
  • 它们需要组合在一起并按 YEAR 列排序......所以是的,顺序很重要。
  • 编辑后的答案仍然不起作用,因为将所有地方按字母顺序组合在一起,然后在相同的地方对年份进行排序......我需要根据 YEAR 列对这些地方进行排序.. . 不基于字母表。
【解决方案2】:

您可以使用窗口聚合函数来实现这一点:

SELECT 
    year, 
    place
FROM 
    tablename
ORDER BY
    MIN(year) OVER (PARTITION BY place),
    place,
    year ;

测试于:SQLfiddle.com

【讨论】:

  • @GriffeyDog,谢谢。您已经获得了我的支持,我很幸运在 OP 澄清之后看到了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 2011-08-22
  • 2011-07-04
  • 1970-01-01
相关资源
最近更新 更多