Oracle

初學者 SQL:來自 GROUP BY 的意外結果

  • February 9, 2018

我有一張sidewalk_deficiency桌子:

create table sidewalk_deficiency (
   def_id number(10), 
   insp_id number(10),
   def_length number(10,2));
insert into sidewalk_deficiency values (10,1,.5);
insert into sidewalk_deficiency values (11,1,1);
insert into sidewalk_deficiency values (12,1,1.5);
insert into sidewalk_deficiency values (13,2,2);
insert into sidewalk_deficiency values (14,2,2.5);
commit;

   DEF_ID    INSP_ID  DEF_LENGTH
---------- ----------  ----------
       10          1          .5
       11          1           1
       12          1         1.5
       13          2           2
       14          2         2.5

我可以創建一個查詢,通過計算每次檢查的缺陷長度來總結人行道檢查:

select 
   insp_id,
   sum(def_length) as def_length 
from 
   sidewalk_deficiency 
group by 
   insp_id

  INSP_ID DEF_LENGTH
---------- ----------
        1          3
        2        4.5

**這正如我所料。**輸出兩行;每個人一個insp_id


我知道上面的查詢確實提供了所需的輸出。但是,我真的不明白為什麼它會以這種方式工作。

def_length誠然,當我編寫這樣的查詢時,將欄位包括在聚合函式group by子句中對我來說更有意義。對我來說,我知道我想把它折疊def_length成一個總和,所以在我看來我應該按它分組。

select 
   insp_id,
   sum(def_length) as def_length 
from 
   sidewalk_deficiency 
group by 
   insp_id,
   def_length       --<<--Problem

  INSP_ID DEF_LENGTH
---------- ----------
        2        2.5
        1         .5
        1          1
        2          2
        1        1.5

當然,正如我們所看到的,我的思維過程是有缺陷的。當我在 中包含該def_length欄位時group by,它產生的記錄比我預期的要多。

原諒我的無知,但為什麼第二個查詢比第一個查詢產生更多的結果?我會認為在聚合函式中包含該欄位,並且group by按照我的計劃對行進行分組。

這個答案與其他答案有點不同,但我理解您的問題與“在 SELECT 和 GROUP BY 之間添加/刪除列的邏輯是什麼”更相關。如果不合適,請告訴我,我會刪除。

這並不是真正的怪癖,它只是聚合的基本規則。如果我計算住在我家的人(總共 3 個),我會計算住在我地址的人。所以我可以說

SELECT Address
     ,COUNT(PersonID) AS PeopleCount
FROM Household
GROUP BY Address

這將給我在我的地址的人數。

如果我嘗試按名稱進行操作:

SELECT Address
      Name
     ,COUNT(PersonID) AS PeopleCount
FROM Household
GROUP BY Address
       ,Name

然後它會在人數中給我一個“1”值,因為我家中每個名字的每個地址只有 1 個人。

如果我家有 2 個同名的人,那麼這兩個人的“PeopleCount”值將是“2”,直到我找到要添加的其他內容以使記錄獨一無二。

因此,您將項目添加到 SELECT/GROUP BY 的原因是基於 UNIQUE 記錄執行聚合。添加到 SELECT 語句的列越多,記錄的唯一性就越高。

引用自:https://dba.stackexchange.com/questions/197421