如何在Oracle SQL中只选择一种记录类型(如果存在),否则选择另一种类型?[重复]

r1wp621o  于 2023-04-11  发布在  Oracle
关注(0)|答案(1)|浏览(152)

此问题已在此处有答案

Select First Row of Every Group in sql [duplicate](2个答案)
Fetch the rows which have the Max value for a column for each distinct value of another column(35个回答)
Return row with the max value of one column per group [duplicate](3个答案)
Get top results for each group (in Oracle)(5个答案)
5天前关闭。
假设我有一个如下所示的结果,它来自于在后台使用Oracle Server的多个表(它不是一个表)的一组复杂查询。
当我有像type in ('A','B')这样的where条件时,就会出现这种情况。我在源表中也有其他类型,但现在我只使用这两种类型。
| ID|代码|类型|
| --------------|--------------|--------------|
| 1|一百二十三|A|
| 二|二一四|B|
| 三|三百三十六|A|
| 1|二百四十五|B|
| 二|二一四|A|
| 四|一百二十三|B|
现在我希望一个ID只有一条记录。也就是说,如果存在,就输入A,否则输入B。如果同一ID的两条记录都存在,那么只输入A。
此结果中还有其他列,其中数据对于单个ID保持相同,但codetype除外
结果应该如下所示
| ID|代码|类型|
| --------------|--------------|--------------|
| 1|一百二十三|A|
| 三|三百三十六|A|
| 二|二一四|A|
| 四|一百二十三|B|
我尝试使用组函数与外部查询,但似乎不能应用任何组函数的整个结果。
我试着对每种类型单独使用联合。但它再次给出了两种类型。
我不知道如何才能得到我想要的结果。

kr98yfug

kr98yfug1#

您可以使用ROW_NUMBER()函数来实现此结果,例如

WITH YOUR_TABLE_DATA (ID,CODE,TYPE)
AS
(
     SELECT 1,  123,'A' FROM DUAL UNION ALL
     SELECT 2 , 214,    'B' FROM DUAL UNION ALL
     SELECT 3 , 336 ,   'A' FROM DUAL UNION ALL
     SELECT 1 , 245     ,'B' FROM DUAL UNION ALL
     SELECT 2 , 214 ,   'A' FROM DUAL UNION ALL
     SELECT 4,  123 ,   'B' FROM DUAL 
)
SELECT X.ID,X.CODE,X.TYPE FROM
(  
  SELECT Y.ID,Y.CODE,Y.TYPE,
     ROW_NUMBER()OVER(PARTITION BY Y.ID ORDER BY Y.TYPE ASC)XCOL 
  FROM YOUR_TABLE_DATA Y
)X WHERE X.XCOL=1

https://dbfiddle.uk/aBbWTqZP

相关问题