代码之家  ›  专栏  ›  技术社区  ›  Gern Blanston

SQL查询在按另一个字段排序时获取一个字段的前x个“distinct”值?

sql
  •  0
  • Gern Blanston  · 技术社区  · 14 年前

    我在数据库中有一个表,它有一个int字段、一个非唯一的id字段以及其他字段。我需要按int字段排序,然后得到前x个不同的id字段。

    例如,如果这些是我的表值(按intfld排序):

    id  intfld
    CC  1
    AA  2
    CC  3
    AA  4
    FF  4
    OO  5
    EE  6
    KK  6
    

    我想要前三个ID的返回值是cc,aa,ff。

    我试过分头和分组,但我认为他们不会起作用。也许我遗漏了一些明显的东西,因为我在SQL中的工作不多。

    我可以用SQL语句来实现这一点吗?

    谢谢。

    编辑:我正在使用Oracle。

    2 回复  |  直到 14 年前
        1
  •  2
  •   babtek    14 年前

    这会让你走上正确的轨道:

    SELECT 
      ID AS MyDistinctValue, 
      MIN(intfld) AS MySort
    FROM
      MyTable
    GROUP BY ID
    ORDER BY MySort
    
        2
  •  0
  •   Vincent Savard Midhun    14 年前

    如果你有这些结果呢:

    A, 1
    B, 2
    C, 3
    D, 3
    E, 4
    

    你会选择C还是D?它是随机的,因此通常不是一个好的解决方案。我肯定会选择全部四个(A、B、C、D),而不是像下面这样的查询:

    WITH TT AS (
        SELECT id, RANK() OVER(ORDER BY MIN(intfld)) AS R
        FROM YourTable
        GROUP BY ID
    )
    SELECT id
    FROM TT
    WHERE R <= 3;
    

    选择A、B、C和D。