sql - 选择 ColA=ColB 的行,并添加一个新列,告知 ColA 中的原始数据是否重复

标签 sql oracle group-by case having

我想弄清楚如何查询一个表(该表实际上是一个结果集,所以它将是一个子查询),按 ColA=ColB 对其进行分组(见下文),并一步创建一个计算字段。

所以,如果我的测试数据看起来像

可乐 可乐 可乐

1 1 aaa
1 2 bbbb
1 3 cc
2 2 dddd
3 3 eeee
3 4 噗
3 5 嘎嘎
3 6 呵呵
4 4 iii
5 5 jjjj
6 6 kkkk
6 7 等
6 8 毫米

我只想检索 ColA=ColB 的行并添加一个新列,告诉我 ColA 中的原始数据是否为原始数据。被重复了。见下文。

ColA ColB ColC 倍数

1 1 aaaa 是
2 2 dddd 没有
3 3 eeee 是
4 4 iii 没有
5 5 jjjj 没有
6 6 kkkk 是

有人可以帮我解决语法问题吗?我一直在玩 Group By's 和 SubSelects 无济于事。我是否需要对 multiples 字段使用 case 语句?

最佳答案

发布 create table 和 insert 语句而不是 Desc table 和 select * from table_name 更有帮助; http://tkyte.blogspot.com/2005/06/how-to-ask-questions.html

create table test_repeat(
   cola number,
   colb number,
   colc varchar2(20)
   );

insert into test_repeat values (1,1,'aaa'); 
insert into test_repeat values (1,2,'bbbb');    
insert into test_repeat values (1,3,'cccc');    
insert into test_repeat values (2,2,'dddd');    
insert into test_repeat values (3,3,'eeee'); 
insert into test_repeat values (3,4,'ffff');    
insert into test_repeat values (3,5,'gggg');    
insert into test_repeat values (3,6,'hhhh');    
insert into test_repeat values (4,4,'iiii');    
insert into test_repeat values (5,5,'jjjj');    
insert into test_repeat values (6,6,'kkkk');    
insert into test_repeat values (6,7,'llll');    
insert into test_repeat values (6,8,'mmmm');
commit;

1、可以使用Oracle的解析函数Lead查看您的结果集以查看下一行的 colA 是否相同(在订购后..),例如..
select * from
(select colA, colb,
       (case when colA = (lead(cola) over 
                          (partition by colA order by cola, colb))
            then 'Yes'
            else 'No'
       end) multiples,
       colc
  from test_repeat)
  where colA = colb
/

      COLA       COLB MUL COLC
---------- ---------- --- --------------------
         1          1 Yes aaa
         2          2 No  dddd
         3          3 Yes eeee
         4          4 No  iiii
         5          5 No  jjjj
         6          6 Yes kkkk

2. 或者你可以得到COLA的每个值的计数并进行比较,看看是否有重复...
select a.colA, a.colb, a.colc,
       (case when (select count(*) from test_repeat t where t.cola = a.colA) > 1
            then 'Yes'
            else 'No'
       end) Repeat
  from test_repeat a
  where colA = colB
/

      COLA       COLB COLC                 REP
---------- ---------- -------------------- ---
         1          1 aaa                  Yes
         2          2 dddd                 No
         3          3 eeee                 Yes
         4          4 iiii                 No
         5          5 jjjj                 No
         6          6 kkkk                 Yes

它们都同样简单,但是 我建议使用分析函数方法,因为我发现它对于所有查询通常更快我过去曾与之合作过。

关于sql - 选择 ColA=ColB 的行,并添加一个新列,告知 ColA 中的原始数据是否重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5722074/

相关文章:

mysql - 如何编写sql命令来获取这样的数据

sql - PostgreSQL 中的聚簇索引?

oracle - 推荐一本关于 "expressive"PL/SQL 的书吗?

python - 使用 groupby 获取组中具有最大值的行

sql - 如何在 Excel 中进行内连接(例如使用 VLOOKUP)

mysql - MySQL 中何时使用单引号、双引号和反引号

linux - 主机 key 验证失败。甲骨文11g

sql - 上一个星期五

mysql - 尝试按 SQL 中具有最新日期的字段进行分组,其中另一个字段相同

sql - 在 Power BI 中使用计数和分组依据