2016-11-22 89 views
0

我有如下表:MySQL-最大計數多組

╒═══════════╤════════════╤════════════╕ 
│ iddmp2g_2 │ A_BCF_name │ A_BTS_name │ 
╞═══════════╪════════════╪════════════╡ 
│ 1   │ CAR.Inem │ CAR.Inem_A │ 
├───────────┼────────────┼────────────┤ 
│ 2   │ CAR.Inem │ CAR.Inem_A │ 
├───────────┼────────────┼────────────┤ 
│ 3   │ CAR.Inem │ CAR.Inem_A │ 
├───────────┼────────────┼────────────┤ 
│ 4   │ CAR.Inem │ CAR.Inem_A │ 
├───────────┼────────────┼────────────┤ 
│ 5   │ CAR.Inem │ CAR.Inem_B │ 
├───────────┼────────────┼────────────┤ 
│ 6   │ CAR.Inem │ CAR.Inem_B │ 
├───────────┼────────────┼────────────┤ 
│ 7   │ CAR.Inem │ CAR.Inem_B │ 
├───────────┼────────────┼────────────┤ 
│ 8   │ CAR.Inem │ CAR.Inem_1 │ 
├───────────┼────────────┼────────────┤ 
│ 9   │ CAR.Inem │ CAR.Inem_1 │ 
├───────────┼────────────┼────────────┤ 
│ 10  │ CAR.Inem │ CAR.Inem_1 │ 
├───────────┼────────────┼────────────┤ 
│ 11  │ CAR.Inem │ CAR.Inem_2 │ 
├───────────┼────────────┼────────────┤ 
│ 12  │ CAR.Inem │ CAR.Inem_2 │ 
└───────────┴────────────┴────────────┘ 

如果我申請以下查詢表中我得到:

SELECT A_BCF_name, COUNT(A_BTS_name) from dmp2g_2 
group by A_BCF_name, A_BTS_name 

結果:

╔════════════╤════════════╤═══════════════════╗ 
║ A_BCF_name │ A_BTS_name │ COUNT(A_BTS_name) ║ 
╠════════════╪════════════╪═══════════════════╣ 
║ CAR.Inem │ CAR.Inem_A │ 4     ║ 
╟────────────┼────────────┼───────────────────╢ 
║ CAR.Inem │ CAR.Inem_B │ 3     ║ 
╟────────────┼────────────┼───────────────────╢ 
║ CAR.Inem │ CAR.Inem_1 │ 3     ║ 
╟────────────┼────────────┼───────────────────╢ 
║ CAR.Inem │ CAR.Inem_2 │ 2     ║ 
╚════════════╧════════════╧═══════════════════╝ 

接下來的方法是根據最後一個字符(數字或字母)得到兩組A_BTS_name,如下所示:

SELECT A_BCF_name, A_BTS_name, COUNT(A_BTS_name) 
FROM dmp2g_2 
WHERE SUBSTRING_INDEX(A_BTS_name,'_',-1) REGEXP '[0-9]+' /*getting only records that end in a number*/ 
GROUP BY A_BCF_name, A_BTS_name 

輸出:在一個字母或字符結束

╔════════════╤════════════╤═══════════════════╗ 
║ A_BCF_name │ A_BTS_name │ COUNT(A_BTS_name) ║ 
╠════════════╪════════════╪═══════════════════╣ 
║ CAR.Inem │ CAR.Inem_1 │ 3     ║ 
╟────────────┼────────────┼───────────────────╢ 
║ CAR.Inem │ CAR.Inem_2 │ 2     ║ 
╚════════════╧════════════╧═══════════════════╝ 

獲取記錄。

SELECT A_BCF_name, A_BTS_name, COUNT(A_BTS_name) 
FROM dmp2g_2 
WHERE SUBSTRING_INDEX(A_BTS_name,'_',-1) REGEXP '[A-Za-z]' /*filter records that ends in a letter*/ 
GROUP BY A_BCF_name, A_BTS_name 

輸出:

╔════════════╤════════════╤═══════════════════╗ 
║ A_BCF_name │ A_BTS_name │ COUNT(A_BTS_name) ║ 
╠════════════╪════════════╪═══════════════════╣ 
║ CAR.Inem │ CAR.Inem_A │ 4     ║ 
╟────────────┼────────────┼───────────────────╢ 
║ CAR.Inem │ CAR.Inem_B │ 3     ║ 
+────────────┼────────────┼───────────────────+ 

此時一切正常。

我的問題是如何獲得每種組的最大數量?我需要在CAR.Inem_A和CAR.Inem_B之間獲得最大數量,並在CAR.Inem_1和CAR.Inem_2之間獲得最大數量。結果應該是這樣的:

╔════════════╤════════════════════════╤════════════════════════╗ 
║ A_BCF_name │ MAX(A_BTS_name_number) │ MAX(A_BTS_name_letter) ║ 
╠════════════╪════════════════════════╪════════════════════════╣ 
║ CAR.Inem │ 3      │ 4      ║ 
╚════════════╧════════════════════════╧════════════════════════╝ 

我感謝所有幫助

感謝

+0

什麼是'numTRX850'和'numTRX1900'?在您的示例數據中它不存在。但是在你的預期結果中,你有那些專欄。 – Viki888

+0

你似乎有很多重複。你的主鍵在哪裏? – Strawberry

+0

@ Viki888是最大計數結果的別名 – Leo99

回答

0

這裏是你問的,讓你的信息的查詢,但結果被安排在一個更查詢 - 友好的方式。

select 
t3.A_BCF_name, 
t3.record_type, 
max(t3.record_count) as max_record_count 
from 
    (
    select 
    t2.A_BCF_name, 
    t2.A_BTS_name, 
    t2.record_type, 
    count(t2.record_type) record_count 
    from 
    (
    select 
    t1.iddmp2g_2, 
    t1.A_BCF_name, 
    t1.A_BTS_name, 
    case when SUBSTRING_INDEX(t1.A_BTS_name,'_',-1) REGEXP '[A-Za-z]' then 'letter' else 'number' end as record_type 
    from dmp2g_2 as t1 
    ) as t2 
    group by t2.A_BCF_name, t2.A_BTS_name, t2.record_type 
) as t3 
group by t3.A_BCF_name, t3.record_type; 

這裏有2個嵌套查詢。最深的嵌套查詢就是再次顯示錶格,並動態添加一個額外的record_type列。下一個嵌套查詢從上述嵌套查詢中選擇聚合在記錄類型上並計算所有組。最後,外部查詢聚合在A_BCF_namerecord_type上,並選擇每個組的最大數量。

這裏是代碼我寫的生成樣本數據來驗證查詢產生期望的結果:

create table dmp2g_2 (
iddmp2g_2 int unsigned primary key auto_increment, 
A_BCF_name varchar(32) not null, 
A_BTS_name varchar(32) not null, 
index (A_BCF_name), 
index (A_BTS_name) 
) engine=innodb; 

insert into dmp2g_2 (A_BCF_name, A_BTS_name) values 
('CAR.Inem', 'CAR.Inem_A'), 
('CAR.Inem', 'CAR.Inem_A'), 
('CAR.Inem', 'CAR.Inem_A'), 
('CAR.Inem', 'CAR.Inem_A'), 
('CAR.Inem', 'CAR.Inem_B'), 
('CAR.Inem', 'CAR.Inem_B'), 
('CAR.Inem', 'CAR.Inem_B'), 
('CAR.Inem', 'CAR.Inem_1'), 
('CAR.Inem', 'CAR.Inem_1'), 
('CAR.Inem', 'CAR.Inem_1'), 
('CAR.Inem', 'CAR.Inem_2'), 
('CAR.Inem', 'CAR.Inem_2'); 

而結果:

mysql> select 
    -> t3.A_BCF_name, 
    -> t3.record_type, 
    -> max(t3.record_count) as max_record_count 
    -> from 
    -> (
    -> select 
    ->  t2.A_BCF_name, 
    ->  t2.A_BTS_name, 
    ->  t2.record_type, 
    -> count(t2.record_type) record_count 
    -> from 
    -> (
    ->  select 
    ->  t1.iddmp2g_2, 
    ->  t1.A_BCF_name, 
    ->  t1.A_BTS_name, 
    ->  case when SUBSTRING_INDEX(t1.A_BTS_name,'_',-1) REGEXP '[A-Za-z]' then 'letter' else 'number' end as record_type 
    ->  from dmp2g_2 as t1 
    -> ) as t2 
    -> group by t2.A_BCF_name, t2.A_BTS_name, t2.record_type 
    -> ) as t3 
    -> group by t3.A_BCF_name, t3.record_type; 
+------------+-------------+------------------+ 
| A_BCF_name | record_type | max_record_count | 
+------------+-------------+------------------+ 
| CAR.Inem | letter  |    4 | 
| CAR.Inem | number  |    3 | 
+------------+-------------+------------------+ 
2 rows in set (0.00 sec) 
+1

對不起,我遲到的答覆,謝謝! – Leo99