【发布时间】:2010-04-02 05:12:02
【问题描述】:
我正在尝试为 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 有序组的第一条记录?
【问题讨论】:
-
您想要按地区聚合还是每个地区的第一行或其他什么?
-
我希望每个 external_id 有一个结果(这可能是多个结果的总数),这是该 external_id 可用区域中最具体的。因此,如果有两个 external_id=3 的模型,如果同时存在“us”和 NULL,我只想要一个“us”。
标签: sql ruby-on-rails