1

我有这个查询,我想检索结果,只按 分组Banksphere.servicio_id,不做任何事情,sum(XXX)因为每个Banksphere.servicio_id都有自己的值,用hora_id,peticion_idvalor...

所以结果一定是这样的......

[servicio_id 1]
(hora_id 1) (hora_id 2) (hora_id 3)   ... 
(peticion_id 1) (peticion_id 2)    ...
(media 1) (media 1) ...    
(valor 1) (valor 1) ...    
...
[servicio_id 2]
(hora_id 1)    
(peticion_id 1) (peticion_id 2) ...    
(media 2)    
(valor 2)    
...

到目前为止我的查询 -

$sqlQuery = sqlsrv_query($conn, "
    SELECT
        Umbrales.minimo as media,
        uok.minimo as media_ok,
        Banksphere.id as valor_id,
        Umbrales.id as umbral_id,
        Banksphere.servicio_id,
        Banksphere.peticion_id,
        Banksphere.hora_id,
        Banksphere.valor
    FROM
        Banksphere
    LEFT JOIN
        Umbrales
    ON Banksphere.hora_id = Umbrales.hora_id 
    AND Banksphere.dia_id = Umbrales.dia_id 
    AND Banksphere.servicio_id = Umbrales.servicio_id
    AND Banksphere.entidad_id = Umbrales.entidad_id 
    AND Banksphere.peticion_id = Umbrales.peticion_id
    LEFT JOIN
        Umbrales uok
    ON Banksphere.hora_id = uok.hora_id 
    AND Banksphere.dia_id = uok.dia_id 
    AND Banksphere.servicio_id = uok.servicio_id
    AND Banksphere.entidad_id = uok.entidad_id 
    AND uok.peticion_id = 0
    WHERE
        Banksphere.entidad_id = '$entidad_id'
    AND
        Banksphere.reconocido = 0
    AND
        Banksphere.fecha = '$fecha'
    ORDER BY
        Banksphere.servicio_id ASC,
        Banksphere.hora_id DESC,
        Banksphere.peticion_id ASC
");
4

1 回答 1

2

小故事:使用 ORDER BY,而不是 GROUP BY;使用 MySQL;或使用 PostgreSQL 并密切注意您的功能依赖关系。(我不确定 PostgreSQL 是否适用于您的情况。)

如果 Banksphere.servicio_id 在您的结果集中是唯一的,请使用 ORDER BY 而不是使用 GROUP BY。如果 Banksphere.servicio_id 在此上下文中是唯一的,则使用 ORDER BY 的结果集是确定的,但使用 GROUP BY 的结果集不是。

首先,看这个简单的表格。

create table test (
  column_1 integer,
  column_2 integer,
  column_3 integer 
  );

insert into test values
(1, 2, 3),
(1, 4, 5),
(1, 6, 7),
(1, 8, 9);

按列分组会为该列中的每个值返回一行。

select column_1, column_2, column_3
from test
group by column_1

此查询应返回一行。当然,“column_1”中的值将是 1。“column_2”和“column_3”会出现什么值?

你说不出来。事实上,这个查询在任何符合标准的 SQL dbms 中都会给你一个语法错误,因为你没有告诉它如何处理“column_2”和“column_3”。在兼容的 SQL dbms 中,“column_2”和“column_3”必须是 GROUP BY 的一部分或用于聚合函数。

MySQL执行这种查询而不会出错,但返回不确定的结果。“服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。” MySQL 将此称为功能。我称之为“按设计破坏”——不确定性不是 SQL dbms 中的一个可防御特性。

在稍微不同的条件下,兼容的 dbms可以返回非聚合列,而不会将它们显式包含在 GROUP BY 中。例如,PostgreSQL 会让你GROUP BY the primary key

当 GROUP BY 存在时,SELECT 列表表达式引用未分组列是无效的,除非在聚合函数中或未分组列在功能上依赖于分组列,否则将返回多个可能的值未分组的列。如果分组列(或其子集)是包含未分组列的表的主键,则存在功能依赖性。[重点补充]

因此,在 PostgreSQL 9.1+ 中,您可以查询具有这样主键的表。

create table test (
  column_1 integer,
  column_2 integer,
  column_3 integer,
  column_4 integer,
  primary key (column_1, column_2)
  );

insert into test values
(1, 1, 2, 3),
(1, 2, 4, 5),
(1, 3, 6, 7),
(1, 4, 8, 9);

select column_1, column_2, column_3, column_4
from test
group by column_1, column_2
order by column_1, column_2

COLUMN_1  COLUMN_2  COLUMN_3  COLUMN_4
--
1         1         2         3
1         2         4         5
1         3         6         7
1         4         8         9

“column_3”和“column_4”列不属于 GROUP BY,也不属于任何聚合函数。但是 GROUP BY 中的列和选择列表中的非聚合列之间存在函数依赖关系,因此结果是确定的。

据我所知,PostgreSQL 是目前唯一实现这部分 SQL 标准的 SQL dbms。(该标准比 PostgreSQL 走得更远。)

于 2012-12-12T11:07:32.103 回答