最近在專案中遇到乙個這樣的需求:有乙個流量圖,需要統計從a節點流出的流量,以及每乙個下游節點收到的流量,用於統計比例,每一條流量的邊作為sql的一行進行儲存。如下面的sql所示:
create
table
`test_table`
(`id`
intnot
null
auto_increment
comment
'id,系統自增'
, pre_node_name varchar
notnull
comment
'上游節點名稱'
, pre_node_out int
notnull
comment
'上游節點流出流量'
, next_node_name varchar
notnull
comment
'下游節點名稱'
, next_node_in int
notnull
comment
'下游節點流進流量'
, rate double
notnull
comment
'下游節點流量佔上游節點比例'
,primary
key(id)
)comment
='測試'
然後插入下面的資料:
insert
into test_table
(pre_node_name, pre_node_out, next_node_name, next_node_in, rate)
values
("a"
,100
,"b",40
,0.4),
("a"
,100
,"c",60
,0.6),
("d"
,200
,"e"
,100
,0.5),
("d"
,200
,"f"
,100
,0.5
);
資料顯示為:
idpre_node_name
pre_node_out
next_node_name
next_node_in
rate1a
100b
400.42a
100c
600.63d
200e
1000.54d
200f
1000.5
在統計彙總資料的時候,怎麼統計流出的流量一共多少呢?select sum(pre_node_out) from test_table
肯定是錯誤的,會重複統計。答案是使用row_number() over
函式。
row_number() over函式的用法
首先看看row_number() over函式的用法:
row_number(
)over([
partition
by partition_expression,..
.]order
by sort_expression [
asc|
desc],
...)
partition by
語句將結果按照partition by的列進行分組,order by
語句將每個分組內的資料按照那列進行排序,然後row_number()
對每個分組從1開始進行編號。例如以下語句:
select
*, row_number(
)over
(partition
by pre_node_out order
by next_node_name asc
) rank from test_table order
by pre_node_name asc
得到結果:
idpre_node_name
pre_node_out
next_node_name
next_node_in
rate
rank1a
100b
400.412
a100c60
0.623d
200e
1000.514
d200
f100
0.52
回到最開始的那個問題,怎麼統計流出的流量一共多少呢?我們只要按照上游節點名進行分組,然後再統計每一組第乙個個流出的流量就可以了:
select
sum(
case
when rank=
1then pre_node_out else
0end
)from
(select
*, row_number(
)over
(partition
by pre_node_name) rank from test_table)
得到正確結果:300.
row_number() over函式的基本用法用法
sql server row_number function
row number over 分析函式
今天用到了row number over 現在就以知識點的形式總結一下,以便於以後的回顧。參考資料msdn 語法 row number over partition by value expression n order by clause 通過語法可以看出 over裡有兩個引數,partition...
row number over 分析函式
今天用到了row number over 現在就以知識點的形式總結一下,以便於以後的回顧。參考資料msdn 語法 row number over partition by value expression n order by clause 通過語法可以看出 over裡有兩個引數,partition...
ROW NUMBER OVER函式運用
語法 row number over partition by column order by column partition by 相當於資料庫中的group by 說明 row number over partition by col1 order by col2 表示根據col1分組,在分組...