【问题标题】:Groupwise sorting with SQL使用 SQL 进行分组排序
【发布时间】:2019-01-05 09:09:11
【问题描述】:

我需要按组对数据进行排序。据我所知,这不能通过多个条件使用sort 来实现,而且group 也不是我需要的,因为我不想减少记录,而是在将组保持在一起的同时对它们进行排序。看以下数据:

Group Data1 Data2 
a      1      5       
a      2      4       
a      3      7       
a      4      6       
b      1      9       
b      2      2       
b      3      1       
b      4     13       
c      1      8       
c      2     10       
c      3     13       
c      4     12      

我希望这些组保持在一起,然后按 Data2 desc 排序,然后按 Data1 desc 排序。为了使它们保持在一起,任何组的第一条记录之后跟在同一组的其余记录之后,以相同的方式排序。考虑一下,该组按max Data2 desc,max Data1 desc 排序,而不是按字母顺序。

Group Data1 Data2
b      4     13  
b      1      9  
b      2      2  
b      3      1  
c      3     13  
c      4     12  
c      2     10  
c      1      8  
a      3      7  
a      4      6  
a      1      5  
a      2      4  

我可以用 SQL 来实现吗?

在其他环境中,我可以定义一个比较器,然后简单地按 Group、Data2、Data1 排序。

【问题讨论】:

  • "现在我希望这些组保持在一起,然后按 Data2 desc 和 Data1 desc 排序,因此结果应该是:" 为什么组 b、c 和 a 的顺序为什么不是 a、b , c 例如?..您使用哪个 MySQL 版本? SELECT VERSION(); 除了在列名中使用增量看起来很可疑,而且是规范化的绝佳候选者。
  • 如果您对组订购没有特殊要求,例如我问“为什么组 b、c 和 a 组为什么不是 a、b、c”.. 你可以简单地做使用ORDER BY test.group ASC , test.Data2 DESC , test.Data1 DESC
  • 我同意 Raymond Nijland 的观点,所提供的信息并不充分 - 请说明您对 a 列的要求,除此之外它应该保持一致。
  • 仍有待解决的问题...您是否希望 b 成为第一组,因为它的 data2 值 (13) 和 c 也是最高的?
  • @MichaelTiefenbacher bData2 desc, Data1 desc 排序时的最高记录 - b 有 (13, 4),c 有 (13, 3)

标签: sql sorting db2


【解决方案1】:

ORDER BY 子句中使用分析函数:

select *
from mytable
order by
  max(data2) over (partition by "Group") desc,
  max(data1) over (partition by "Group") desc,
  "Group",
  data2 desc,
  data1 desc;

【讨论】:

  • data2 和 data1 应该在我猜你的语句的 order by 末尾有一个“desc”
  • 这按预期工作。我唯一的问题是我无法使用max() 中选择列表中的exists-subselect。
【解决方案2】:

试试这个:

with a (Group, Data1, Data2 ) as (values
  ('a', 1, 5)       
, ('a', 2, 4)       
, ('a', 3, 7)       
, ('a', 4, 6)       
, ('b', 1, 9)       
, ('b', 2, 2)       
, ('b', 3, 1)       
, ('b', 4, 13)       
, ('c', 1, 8)       
, ('c', 2, 10)       
, ('c', 3, 13)       
, ('c', 4, 12)      
)
select a.*
from (
select b.*, rownumber() over(order by data2 desc, data1 desc) rn2
from (
select a.*, rownumber() over (partition by group order by data2 desc, data1 desc) rn1
from a
) b
where rn1=1
) b 
join a on a.group=b.group
order by b.rn2, a.data2 desc, a.data1 desc;

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2011-07-18
    相关资源
    最近更新 更多