簡體   English   中英

如何按多行多列分組

[英]How to group by multiple rows and column

  1. 每個用戶有 3 個代碼(10,20,30)
  2. 如果所有代碼(10,20,30)都為真,則必須加入
  3. 如果任何代碼(10,20,30)是假的,那么它必須被忽略
  4. 我們必須檢查 max(date)

表如下:

+-------+------+-------+------------+
| user  | code | bool  |    date    |
+-------+------+-------+------------+
| user1 |  10  | True  | 31/10/2019 |
| user1 |  20  | True  | 31/10/2019 |
| user1 |  30  | False | 31/10/2019 |
| user2 |  10  | True  | 31/10/2019 |
| user2 |  20  | True  | 31/10/2019 |
| user2 |  30  | True  | 31/10/2019 |
| user3 |  10  | True  | 31/10/2019 |
| user3 |  20  | True  | 31/10/2019 |
| user3 |  30  | True  | 31/10/2019 |
+-------+------+-------+------------+

輸出 user2 和 user3 是 JOINED,user1 是 NEGECTED

+------------+--------+-----------+
|    DATE    | JOINED | NEGLECTED |
+------------+--------+-----------+
| 31/10/2019 |    2   |    1      |
+------------+--------+-----------+

我假設列bool的數據類型為BOOL ,因此您可以在 2 個聚合級別中進行:

select t.date,
  sum(total = 3) joined,
  sum(total <> 3) neglected
from (
  select date, user, sum(bool) total
  from tablename
  group by date, user
) t
group by t.date

請參閱演示
結果:

| date       | joined | neglected |
| ---------- | ------ | --------- |
| 31/10/2019 | 2      | 1         |

如果列的bool數據類型是VARCHAR則更改:

sum(bool) total

到:

sum(bool = 'True') total

我將從一個查詢開始,該查詢將用戶分組並根據代碼計算他們的狀態。 然后,我會用一個聚合查詢來包裝這個查詢,以計算每天加入或忽略的用戶數量:

SELECT   `date`,
         SUM(`status` = 'joined') AS joined,
         SUM(`status` = 'neglected') AS neglected
FROM     (SELECT   `user`,
                   `date`,
                   CASE BIT_AND(bool) WHEN TRUE THEN 'joined' ELSE 'neglected' END AS status
          FROM     `mytable`
          GROUP BY `user`, `date`) t
GROUP BY `date`

暫無
暫無

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

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