簡體   English   中英

如何計算每個不同組中的行數?

[英]How to Count the number of rows within each distinct group?

給定以下MySQL表:

| id | category | Hour | quantity|
|  0 | Sunday   |  10  |  32    |
|  0 | Sunday   |  11  |  19    |
|  0 | Sunday   |  12  |  48    |
|  0 | Sunday   |  19  |  7     |
|  1 | Monday   |  09  |  45    |
|  1 | Monday   |  10  |  17    |
|  1 | Monday   |  12  |  18    |
|  2 | Tuesday  |  08  |  16    |
|  2 | Tuesday  |  09  |  39    |
|  2 | Tuesday  |  10  |  24    |
|  2 | Tuesday  |  11  |  37    |
|  2 | Tuesday  |  12  |  40    |

我需要計算第五列,該列必須是“數量”除以id的行數:對於0,有4行,對於1 3行,對於2 5行。

| id | category | Hour | quantity| avg |
|  0 | Sunday   |  10  |  32    |  8   |
|  0 | Sunday   |  11  |  19    | 4.75 | 
|  0 | Sunday   |  12  |  48    |  12  |
|  0 | Sunday   |  19  |  7     | 1.75 |
|  1 | Monday   |  09  |  45    |  15  |
|  1 | Monday   |  10  |  17    |  5.7 |
|  1 | Monday   |  12  |  18    |   6  |
|  2 | Tuesday  |  08  |  16    | 3.2  |
|  2 | Tuesday  |  09  |  39    | 7.8  |
|  2 | Tuesday  |  10  |  24    | 4.8  |
|  2 | Tuesday  |  11  |  37    | 7.4  |
|  2 | Tuesday  |  12  |  40    |  8   |

如何在MySQL查詢中得到結果?

第一個表是此查詢的結果:

 select id, category, Hour, count(*) as quantity
 FROM table_1
 GROUP by id, Hour ORDER by id, Hour;

為了獲得每個id出現的行數,我嘗試這樣做,但是我得到了大量的id = 0出現次數,而不是上一個查詢中的id = 0行:

select  id, Hour,  count(id)  as q
FROM table_1 
GROUP by id 

這是mySql 5.6。

這確實很丑陋且繁瑣,但這是沒有主鍵即可獲得結果的唯一方法:

SELECT 
  t.id, 
  t.category, 
  t.hour, 
  quantity,  
  ROUND(quantity/count,2) AS avg
FROM table_1 t
    JOIN (SELECT 
              id, Hour, count(*) as quantity
             FROM table_1
            GROUP by id, category, Hour) AS qty
    ON t.id = qty.id AND t.hour = qty.hour

    JOIN (SELECT
            id, count(distinct hour) as count 
             FROM table_1
                GROUP BY id) as counts 
    ON t.id = counts.id
GROUP BY id, hour;

至少對於我來說,它似乎在本地工作,猜測您原始數據集的樣子。

但是,可能有一種更簡單的方法。

編輯:在第二次檢查時,“數量”子查詢並沒有真正增加我所看到的,因此可以將其替換為“ count(*)”,從而進行更優化的查詢:

SELECT 
  t.id, 
  t.category, 
  t.hour, 
  count(*) as quantity,  
  ROUND(count(*)/count,2) AS avg
FROM table_1 t
    JOIN (SELECT
            id, count(distinct hour) as count 
             FROM table_1
                GROUP BY id) as counts 
    ON t.id = counts.id
GROUP BY id, hour;

您需要在僅按id分組的子查詢中進行計數。 將子查詢加入主查詢並進行除法。

SELECT id, category, hour, COUNT(*) AS quantity, COUNT(*)/count AS avg
FROM table_1
JOIN (SELECT id, COUNT(DISTINCT hour) AS count
      FROM table_1
      GROUP BY id) AS counts 
    ON table_1.id = counts.id
GROUP BY table_1.id, table_1.hour
ORDER BY table_1.id, table_1.hour

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM