Oracle Query阻止显示的重复记录

时间:2018-03-26 02:43:01

标签: oracle

假设我有一个像这样的表结构:

ID   |    Name   |     SCHOOLNAME     |    CODESCHOOL
 1        DARK      Kindergarten 123           1
 2        DARK      Kindergarten 111           1
 3       Knight       NY University            3
 4       Knight       LA Senior HS             2
 5        JOHN          HARVARD                3

所以,如何将上面的所有数据显示为:

ID   |    Name   |     SCHOOLNAME     |    CODESCHOOL
 1        DARK      Kindergarten 123           1
 3       Knight       NY University            3
 5        JOHN          HARVARD                3

我的目的是想要显示最大的codeschool数据,但是当我尝试使用下面的查询时:

SELECT NAME, SCHOOLNAME, MAX(CODESCHOOL) FROM TABLE GROUP BY NAME, SCHOOLNAME

但结果是这样的:

ID   |    Name   |     SCHOOLNAME     |    CODESCHOOL
 1        DARK      Kindergarten 123           1
 2        DARK      Kindergarten 111           1
 3       Knight       NY University            3
 4       Knight       LA Senior HS             2
 5        JOHN          HARVARD                3

可能是由GROUP BY SCHOOLNAME引起的,当我试图不选择SCHOOLNAME时,数据显示的方式与我预期的一样,但我需要SCHOOLNAME字段来查找我的搜索条件查询

希望你们能帮我解决这个问题

任何帮助将不胜感激

感谢

2 个答案:

答案 0 :(得分:0)

使用一些古怪的连接,您可以获得每个类别查询的功能获取最大行数。

您基本上需要做的是将表连接到自身,并确保连接的值仅包含CODESCHOOL列的顶部值。

我还添加了:schoolname参数,因为您想按学校名称搜索

示例:

SELECT
    A.*
FROM
    TABLE1 A
    LEFT OUTER JOIN TABLE1 B ON B.NAME = A.NAME
        AND B.CODESCHOOL < A.CODESCHOOL
WHERE
    B.CODESCHOOL IS NULL AND
    (
        (A.SCHOOLNAME = :SCHOOLNAME AND :SCHOOLNAME IS NOT NULL) OR
        (:SCHOOLNAME IS NULL)
    );

这应该创建这个输出,注意黑暗有2个输出,因为它有2行具有相同的代码学校,这是黑暗&#34;类别&#34; /名称中的最大值。

ID|NAME  |SCHOOLNAME      |CODESCHOOL
--| -----|----------------|----------
 4|Knight|LA Senior HS    |         2
 5|JOHN  |HARVARD         |         3
 2|DARK  |Kindergarten 111|         1
 1|DARK  |Kindergarten 123|         1

它不是最有效的查询,但它应该足以作为一个起点。

旁注:我在https://www.xaprb.com/blog/2007/03/14/how-to-find-the-max-row-per-group-in-sql-without-subqueries/

一段时间内公然偷走了这个逻辑

答案 1 :(得分:0)

我正在使用分析窗口函数ROW_NUMBER()。 这将按NAME分组(或分区),然后按DESC顺序选择前1个CODESCHOOL。

 Select NAME, 
   SCHOOLNAME, 
    CODESCHOOL
  From (
     Select NAME, 
     SCHOOLNAME, 
      CODESCHOOL,
      ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY CODESCHOOL DESC) as rn
      from myTable)
  Where rn = 1;