【问题标题】:merge two columns then group by and sorting合并两列然后分组和排序
【发布时间】:2012-12-06 08:10:42
【问题描述】:

全部 我有以下表格和数据,我想将 loc1 和 loc2 合并在一列中,并从 loc 列中删除重复值,然后根据 group_no 列对它进行分组,并根据 group_val 升序进行排序

drop table test;
create table test (loc1 number(9), loc2 number(9), group_no number(9),group_val number(9));
insert into test values(2,3,1,90);
insert into test values(2,9,1,10);
insert into test values(4,3,1,70);
insert into test values(6,8,2,20);
insert into test values(11,7,2,80);
insert into test values(20,15,2,70);
insert into test values(15,14,2,30);
insert into test values(21,31,3,50);
insert into test values(31,32,3,40);

预期结果是:

loc   group_no   
2        1            
3        1            
4        1            
9        1             
11       2
7        2 
20       2
15       2 
6        2
8        2
21       3
31       3
32       3

这个来自 Grish 但没有 group_val 的代码,现在我添加它

select t.loc, max(t.group_no)
(
    select loc1 as loc, group_no from test

    union

    select loc2 as loc, group_no from test
) t
group by t.loc
order by 2,1


if can do it using dense_rank() over partition by group_val.

loc 列将从上到下排序。根据 group_val 列

regards

【问题讨论】:

  • 您的表格数据似乎有一些数据错误...第 8 行? 21、31、3.50?还是 3、50? :)

标签: sql group-by oracle11g


【解决方案1】:

您想要的结果并不完全清楚。也许是这个?:

select loc, group_no 
from
(
    select loc1 as loc, group_no, group_val 
    from test

    union all

    select loc2 as loc, group_no, group_val
    from test
) t
group by group_no, loc
order by group_no asc, max(group_val) desc, loc asc ;

【讨论】:

  • 排序不是针对所有组中的所有成员,我想对每个组进行排序。基于 group_val 列的排序
  • 你试过了吗?正是这样做的,首先按group_no 排序,然后(对于具有相同group_no 的行)按最大group_val
  • 最后一部分, loc asc可能不是你想要的,检查一下。
  • 是的,但无论如何这就是我所需要的。任何 SQL 问题我都会向您咨询。
【解决方案2】:

您可以尝试以下方法:

查询:

select distinct a.loc, a.group_no
from
(select distinct loc1 as loc, group_no
  from test
union all
select distinct loc2, group_no
  from test) as a
order by a.loc asc
;

结果:

LOC    GROUP_NO
2      1
3      1
4      1
6      2
7      2
8      2
9      1
11     2
14     2
15     2
20     2
21     3
31     3
32     3

【讨论】:

  • 请参见第 2 组排序正常,11,2 的值是 80,15,20 是 70,所以第一个数字是 11 或 2,然后是 20 或 15,依此类推
  • 是的,我看到了,你知道为什么会这样吗?因为我的查询在order by 子句中只有a.loc。即使您添加group_no asc,它仍然不会按 Group_No 升序为您提供顺序。所以它必须有一个在联合之后形成的通用列名。因此,如果您添加 loc2 as loc,那么它的工作原理类似于 ypercube 的完美解决方案 :)
【解决方案3】:

您的要求无法满足,因为它们包含冲突。如果您查看前两行,您会在以下数据中看到结果(不使用 loc2):

loc | group_no | group_val
  2 |        1 |        90
  2 |        1 |        10

根据您的要求,它们是重复的,需要减少为单行。但是,您使用什么group_val 值进行排序:90 还是 10?

如果您总是使用最小的group_val 进行排序,那么下面的查询应该可以工作:

select t.loc, t.group_no from
(
    select loc1 as loc, group_no, group_val from test
    union
    select loc2 as loc, group_no, group_val from test
) t
group by t.loc, t.group_no
order by group_no, min(group_val);

【讨论】:

  • 非常感谢您,例如,如果我们看到第 1 组有三个 group_val 分别为 90、10、70。按逻辑排序是从最大值开始,然后是 90,然后是 70,然后是 10。所以 90 group_val 有两个数字是 2,3。如果你问我哪个第一个没问题,因为两者都有 90 那么对于 group_val 70 ,是 4 和 3 。对于 group_val 10 我们有 2,9 。所以排序必须像这样 2,3,4,9 这是在第 1 组中。等等
【解决方案4】:
select loc1, group_no 
from
 (
  select loc1, group_no, group_val from test
  UNION
  select loc2, group_no, group_val from test
 )
group by group_no , loc1
order by group_no, max(group_val), loc1

工作sqlfiddle

编辑:
正如 Codo 提到的,您的数据存在冲突,因此您应该明确您的要求

【讨论】:

  • 是的,很好,但我想在组内,从上到下从最高的 group_val 列到最低的排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2019-01-13
  • 2016-09-23
  • 1970-01-01
相关资源
最近更新 更多