通过查询在postgres组中出现意外行为

时间:2013-11-03 18:19:17

标签: postgresql

我习惯用t-sql中的查询编写组。在t-sql group by中,这将生成一个列表,其中具有相同categorytext的项目组合在一起,然后类别文本组中具有相同类型文本的项目将组合在一起。但这似乎不是这里发生的事情:

Select   "CategoryText", "TypeText"
from "NewOrleans911Categories"
group by "CategoryText", "TypeText";

这是postgres的一些输出。为什么NA​​s没有组合在一起?

    CategoryText; TypeText
    "BrokenWindows";"DRUG VIOLATIONS"
    "NA";"BOMB SCARE"
    "Weapon";"DISCHARGING FIREARMS"
    "NA";"NEGLIGENT INJURY"

3 个答案:

答案 0 :(得分:2)

  

在t-sql组中,这将生成一个列表,其中具有相同categorytext的项目组合在一起,然后类别文本组中具有相同类型文本的项目将组合在一起。

在SQL中,未指定查询返回行的顺序,除非您输入order by子句。通常,您将按查询返回的顺序获取行,这完全取决于查询计划。 (最好我知道,t-sql也这样做。)

无论如何,您需要添加缺少的order by子句以获得预期结果:

Select   "CategoryText", "TypeText"
from "NewOrleans911Categories"
group by "CategoryText", "TypeText"
order by "CategoryText", "TypeText";

或者(我怀疑这是你真正想要的)用order by子句替换group by:

Select   "CategoryText", "TypeText"
from "NewOrleans911Categories"
order by "CategoryText", "TypeText";

答案 1 :(得分:0)

您正在按两列“分组”。当记录与两列匹配时,行仅被“分组”。

在这种情况下,两个NA都有不同的TypeText,因此它们不会分组。就像使用一个独特的,在这种情况下将完成相同的事情。

答案 2 :(得分:0)

您可能需要这样的查询:

select distinct on ("CategoryText") "CategoryText", "TypeText"
from "NewOrleans911Categories"

因为使用group by,您无法选择不在group by语句中的列。