Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.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中GROUPBY子句的第一个_Sql_Ruby On Rails - Fatal编程技术网

获取SQL中GROUPBY子句的第一个

获取SQL中GROUPBY子句的第一个,sql,ruby-on-rails,Sql,Ruby On Rails,我正在尝试为Rails应用程序实现单列区域化,但由于需要复杂的SQL,我遇到了一些主要的难题。对于该系统,一个地区可以由国家代码(例如美国)或大写的大陆代码(例如NA)表示,也可以为空,表示默认信息。我需要根据一些相关信息(如外键)对这些项进行分组,我们称之为外部id 鉴于一个国家及其大陆,我需要能够只选择可用的最具体的区域。因此,如果存在带有国家代码的记录,我会选择它们。如果不是的话,我想要一张有大陆代码的唱片。如果不是这样,我希望记录带有空代码,这样我就可以接收默认值 到目前为止,我认为我可

我正在尝试为Rails应用程序实现单列区域化,但由于需要复杂的SQL,我遇到了一些主要的难题。对于该系统,一个地区可以由国家代码(例如美国)或大写的大陆代码(例如NA)表示,也可以为空,表示默认信息。我需要根据一些相关信息(如外键)对这些项进行分组,我们称之为外部id

鉴于一个国家及其大陆,我需要能够只选择可用的最具体的区域。因此,如果存在带有国家代码的记录,我会选择它们。如果不是的话,我想要一张有大陆代码的唱片。如果不是这样,我希望记录带有空代码,这样我就可以接收默认值

到目前为止,我认为我可以使用生成的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为给定行返回的实际数据似乎无法测量。如何处理此查询以使其仅返回区域的第一条记录\u排序顺序组?

仅返回第一条记录或仅返回第一组记录?从你所写的内容甚至不清楚是否有不止一条记录

在任何情况下,在一个查询中似乎都在竭尽全力做到这一点,但数据库结构并没有为此进行优化。如果只有3个级别,而您需要最具体的级别,为什么不:

SELECT * FROM my_table WHERE region = 'us' GROUP BY external_id
如果这返回了一些东西,那么您可以停止,否则您可以有条件地运行1或2个以上的查询


我可能错了,但我的直觉告诉我,这将产生更好的整体性能,尽管我认为这取决于数据库的细节。

仅第一条记录还是仅第一组记录?从你所写的内容甚至不清楚是否有不止一条记录

在任何情况下,在一个查询中似乎都在竭尽全力做到这一点,但数据库结构并没有为此进行优化。如果只有3个级别,而您需要最具体的级别,为什么不:

SELECT * FROM my_table WHERE region = 'us' GROUP BY external_id
如果这返回了一些东西,那么您可以停止,否则您可以有条件地运行1或2个以上的查询


我可能错了,但我的直觉告诉我,这将产生更好的整体性能,尽管我认为这取决于数据库的具体情况。

您希望按区域或每个区域的第一行进行聚合还是其他什么?我希望每个外部id有一个结果这可能是多个结果的总和,这是该外部id可用的最具体的区域。因此,如果有两个外部id为3的模型,如果同时存在“us”和NULL,我只想要一个“us”。您想要按区域或每个区域的第一行进行聚合还是其他什么?我想要每个外部\u id一个结果这可能是多个结果的总和,这是该外部\u id可用的最具体的区域。因此,如果有两个模型的外部\u id=3,如果同时存在“us”和NULL,我只想要一个是“us”的。抱歉,试图解释这一点有点混乱,因为一开始就很复杂。问题是,我希望所有三个特异性水平都会有有效的结果,即一些具有“us”区域,一些具有“NA”区域,一些具有空区域。我想在一个查询中完成它,因为否则我必须手动合成它们,这绝对不是理想的。抱歉,试图解释这一点有点混乱,因为一开始就很复杂。问题是,我希望所有三个特异性水平都会有有效的结果,即一些具有“us”区域,一些具有“NA”区域,一些具有空区域。我想在一个查询中完成它,因为否则我必须手动合成它们,这绝对不理想。