Postgresql postgres组中的意外行为(按查询)

Postgresql postgres组中的意外行为(按查询),postgresql,Postgresql,我习惯于用t-sql编写分组查询。在t-sqlgroup by中,这将生成一个列表,其中具有相同categorytext的项目被分组在一起,然后具有相同类型文本的类别文本组中的项目将被分组在一起。但这里的情况似乎并非如此: Select "CategoryText", "TypeText" from "NewOrleans911Categories" group by "CategoryText", "TypeText"; 以下是postgres的一些输出。为什么NAs没有组合在一起

我习惯于用t-sql编写分组查询。在t-sql
group by
中,这将生成一个列表,其中具有相同categorytext的项目被分组在一起,然后具有相同类型文本的类别文本组中的项目将被分组在一起。但这里的情况似乎并非如此:

Select   "CategoryText", "TypeText"
from "NewOrleans911Categories"
group by "CategoryText", "TypeText";
以下是postgres的一些输出。为什么NAs没有组合在一起

    CategoryText; TypeText
    "BrokenWindows";"DRUG VIOLATIONS"
    "NA";"BOMB SCARE"
    "Weapon";"DISCHARGING FIREARMS"
    "NA";"NEGLIGENT INJURY"
您正在按两列“分组”。只有当记录与两列匹配时,行才被“分组”


在这种情况下,两个NA都有不同的TypeText,因此它们不会按分组。与使用distinct非常相似,在这种情况下,distinct将完成相同的任务。

可能需要这样的查询:

select distinct on ("CategoryText") "CategoryText", "TypeText"
from "NewOrleans911Categories"
因为使用
groupby
时,无法选择不在
groupby
语句中的列

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

在SQL中,查询返回行的顺序是未指定的,除非抛出ORDERBY子句。通常,您将按照查询返回的顺序获取行,这完全取决于查询计划。(据我所知,t-sql也能做到这一点。)

无论如何,您都希望添加缺少的ORDERBY子句以获得预期结果:

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";

如何从表中选择所有内容,但仅按“CategoryText”进行分组?如果我按“CategoryText”从NewOrleans911Categories组中选择*,则会出现错误:“NewOrleans911Categories.TypeText”列必须出现在group by子句中或用于聚合函数中。我不确定您要在其中执行什么操作。您能更清楚地了解一下预期的结果是什么吗?此查询在t-sql中也会起同样的作用。您希望在CategoryText='NA'的分组记录中看到什么类型的文本?您是否以某种方式将
GROUP BY
ORDER BY
混淆了
groupby
为每个不同的组合返回一行
orderby
将保留所有行,但相同的行将在结果中彼此相邻。这两个子句的组合也是可能的(在大多数情况下,您肯定需要某种类型的
ORDER BY
子句)。
Distinct On
只有在
ORDER BY
子句告诉Postgres非Distinct列的“第一个”值是什么时才有意义。