的順序出現我有如下表2列SQL分組由價值
ID | Dept
1 | A
2 | A
3 | B
4 | B
5 | B
6 | A
我想做一個計數使得輸出應該如下表所示。
Dept | Count
A | 2
B | 3
A | 1
感謝您的幫助提前!
的順序出現我有如下表2列SQL分組由價值
ID | Dept
1 | A
2 | A
3 | B
4 | B
5 | B
6 | A
我想做一個計數使得輸出應該如下表所示。
Dept | Count
A | 2
B | 3
A | 1
感謝您的幫助提前!
略有不同,邁克爾的,相同的結果:
with cte1 as (
select id,
dept,
row_number() over (partition by dept order by id) -
row_number() over (order by id) group_num
from test),
cte2 as (
select dept,
group_num,
count(*) c_star,
max(id) max_id
from cte1
group by dept,
group_num)
select dept,
c_star
from cte2
order by max_id;
我更喜歡你的方法,因爲它使用'row_number()(按ID排序)'而不是'id',這意味着它更強大,以防ids不是順序或非整數。 –
歡呼聲 - 是的,我想這是一種可能性。 –
是的,這將是一個更好的選擇... –
運行此查詢此:
SELECT Dept, count(*) FROM table_name group By Dept
你能檢查一下他的預期輸出嗎 –
你不能用SQL做到這一點。計數會計算不同的項目,因此您的案例中的計數會給您計數A
和計數B
。
您只能按表格中的值進行計數/分組,而不能按行的順序進行計數/分組。如果您不使用order by
,則在SQL中不保證順序。
這種情況下的命令可能是id。我不認爲這是不可能的,但確實看起來很不方便。 –
他的問題是count()函數和如何得到他想要的。他不能。 – mikeb
問題是「你怎麼能得到這個輸出」,並且他認爲他可以使用COUNT()來輕鬆獲得輸出。其結果本身可能不是在SQL中無法實現的。 –
從你的例子看來,你想要爲每個部門計算連續記錄。
您可以通過組合行號和排序ID來完成此操作。
create table tblDept (
id int not null,
dept varchar(50)
);
insert into tblDept values (1, 'A');
insert into tblDept values (2, 'A');
insert into tblDept values (3, 'B');
insert into tblDept values (4, 'B');
insert into tblDept values (5, 'B');
insert into tblDept values (6, 'A');
with orderedDepts as (
select
dept,
id,
row_number() over (partition by dept order by id) -
row_number() over (order by id) as rn
from tblDept
)
select
dept,
count(*) as num
from orderedDepts
group by
dept,
rn
order by
max(id)
給人的輸出:
+------+-----+
| DEPT | NUM |
+------+-----+
| A | 2 |
| B | 3 |
| A | 1 |
+------+-----+
需要指出的是,如果兩個連續的ID之間有相同的部門之間的差距,這將無法正常工作 –
@DeepakPawar更新了答案以涵蓋這種情況......我最初的假設可能是錯誤的。 –
我不明白,你爲什麼要爲部門A的兩個記錄? A部門在表中有3條記錄。 – HoneyBadger
到目前爲止您的嘗試是什麼? – Goose
你能澄清一下輸出是否正確,即應該只有一個應該有一個計數爲3的結果。你提到COUNT這有點誤導。 –