Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Oracle查询中组合SELECT DISTINCT和ROWNUM_Sql_Oracle - Fatal编程技术网

Sql 如何在Oracle查询中组合SELECT DISTINCT和ROWNUM

Sql 如何在Oracle查询中组合SELECT DISTINCT和ROWNUM,sql,oracle,Sql,Oracle,如果可能的话,我需要将下面的两个MySQL语句组合成一个ORACLE查询 最初的查询是 SELECT DISTINCT FIRST_NAME FROM PEOPLE WHERE LAST_NAME IN ("Smith","Jones","Gupta") 然后根据返回的每个第一个\u名称进行查询 SELECT * FROM PEOPLE WHERE FIRST_NAME = {FIRST_NAME} AND LAST_NAME IN ("Smith","Jones","Gupta")

如果可能的话,我需要将下面的两个MySQL语句组合成一个ORACLE查询

最初的查询是

SELECT DISTINCT FIRST_NAME FROM PEOPLE WHERE LAST_NAME IN ("Smith","Jones","Gupta")
然后根据返回的每个第一个\u名称进行查询

SELECT * 
FROM PEOPLE 
WHERE FIRST_NAME = {FIRST_NAME} 
  AND LAST_NAME IN ("Smith","Jones","Gupta") 
ORDER BY FIELD(LAST_NAME, "Smith","Jones","Gupta") DESC 
LIMIT 1
“姓氏列表”用作“默认/覆盖”指示器,因此每个姓氏只有一个人,如果存在多行相同的姓氏,则只使用“姓氏”列表中的最后一个匹配项

我需要一个SQL查询,根据in(a,b,c)中值的顺序返回“in”子句中的最后一行。这是一个示例表,以及我需要的查询结果

对于具有值的表人员

LAST_NAME    FIRST_NAME
.....
Smith        Mike    
Smith        Betty
Smith        Jane
Jones        Mike
Jones        Sally
....
我需要一个基于('Smith','Jones')中不同名字和姓氏的查询,返回

Betty Smith
Jane Smith
Mike Jones
Sally Jones

您可以这样做:

select first_name, last_name
from (
  select p.first_name,
         p.last_name,
         row_number() over (partition by p.first_name
                            order by case p.last_name
                                     when 'Smith' then 1
                                     when 'Jones' then 2
                                     when 'Gupta' then 3
                                     end desc) as rn
  from people p
  where p.last_name in ('Smith','Jones','Gupta')
)
where rn = 1;
select first_name, 
       max(last_name) 
           keep (dense_rank first order by decode(last_name,
                                                  'Smith', 1,
                                                  'Jones', 2,
                                                  'Gupta', 3) desc)
 group by first_name
演示:

编辑

获得更多的专栏并不难。我相信你可以再努力一点来解决这个问题:

select *
from (
  select p.*,
         row_number() over (partition by p.first_name
                            order by case p.last_name
                                     when 'Smith' then 1
                                     when 'Jones' then 2
                                     when 'Gupta' then 3
                                     end desc) as rn
  from people p
  where p.last_name in ('Smith','Jones','Gupta')
)
where rn = 1;
或者像这样:

select first_name, last_name
from (
  select p.first_name,
         p.last_name,
         row_number() over (partition by p.first_name
                            order by case p.last_name
                                     when 'Smith' then 1
                                     when 'Jones' then 2
                                     when 'Gupta' then 3
                                     end desc) as rn
  from people p
  where p.last_name in ('Smith','Jones','Gupta')
)
where rn = 1;
select first_name, 
       max(last_name) 
           keep (dense_rank first order by decode(last_name,
                                                  'Smith', 1,
                                                  'Jones', 2,
                                                  'Gupta', 3) desc)
 group by first_name
Oracle“FIRST”/“LAST”函数允许从具有最大值/最小值的行的其他列中获取值(例如,获取具有最高工资的员工的姓氏,或者在本例中类似的-从具有最高等级的行中获取姓氏)

请使用示例数据和所需结果编辑您的问题。现在还不清楚你想要完成什么。我认为
field()
是一个MySQL函数,而不是Oracle函数。谢谢你回答这个问题!不幸的是,我没有足够清楚地说明这个问题,因为我需要的不是名字和姓氏,而是其他列,向所选列添加*将返回“FROM关键字not found where expected”错误。您能在列中更新您的答案以支持*吗?*在这里不起作用,因为您需要按某些列分组并选择max()保留其他列。对于这些列,您需要使用first_name,添加到select列表和groupby子句。对于这些列,您需要从组中获取first/last,只需copypaste max()keep block,并在max(…)中提及另一列,而不是last_name。或者,为了避免max()保持重复,请使用Sstan的解决方案。您可以指定p.*谢谢您的回答!不幸的是,我没有足够清楚地说明这个问题,因为我需要的不是名字和姓氏,而是其他列,向所选列添加*将返回“FROM关键字not found where expected”错误。你能在列中更新你的答案以支持*吗?我编辑了我的答案。但是我想你可以自己花点力气找出额外的要求。