在SQL中获取GROUP BY子句的第一个

时间:2010-04-02 05:12:03

标签: sql ruby-on-rails

我正在尝试为Rails应用程序实现单列区域化,并且我遇到了一些具有复杂SQL需求的主要问题。对于此系统,区域可以用国家代码(例如us)表示大写的大陆代码(例如NA),或者可以NULL表示“默认”信息。我需要通过一些相关信息(例如外键)对这些项目进行分组(我们称之为external_id)。

鉴于某个国家及其大陆,我需要能够仅选择最具体的区域。因此,如果记录与国家代码一起存在,我选择它们。如果,我不想要带有大陆代码的记录。如果不是这样,我想要一个NULL代码的记录,这样我就可以收到默认值。

到目前为止,我已经认为我可以使用生成的CASE语句来获取任意排序顺序。像这样:

SELECT *, CASE region 
            WHEN 'us' THEN 1 
            WHEN 'NA' THEN 2 
            ELSE 3 
          END AS region_sort 
          FROM my_table 
          WHERE region IN ('us','NA') OR region IS NULL 
          GROUP BY external_id 
          ORDER BY region_sort

问题在于,如果没有聚合函数,GROUP BY为给定行返回的实际数据似乎不可用。如何按下此查询以使其仅返回region_sort有序群组的第一条记录

1 个答案:

答案 0 :(得分:0)

只有第一条记录或只有第一条的记录?你写的是否有不止一条记录,甚至都不清楚。

在任何情况下,似乎您都在向后弯曲以在一个查询中执行此操作,但数据库结构未针对此进行优化。如果只有3个等级并且您想要最具体的,为什么不只是:

SELECT * FROM my_table WHERE region = 'us' GROUP BY external_id

如果返回了某些内容,请停止,否则有条件地运行1或2个查询。

我可能错了,但我的直觉说会产生更好的整体表现,不过我认为这取决于你的数据库的细节。