開窗函數PARTITION BY使用方法

**

具體請看我的博客

**

偶然間讓DB幫忙寫一個SQL,直接感受是:這也太方便太酷了吧!!!

所謂的[SQL寫得好的人,非常受歡迎],一萬個同意!!

最近碰到一個需求,大概就是這個意思

一個人可以重複錄入多條數據,昨天一條,今天一條,今天即爲有效,昨天爲無效 如果是同一天錄入,則按照創建時間先後判定有無效

想到了如下幾種原始方式:

最笨的方式 先按時間倒序查列表,然後使用代碼來進行邏輯判斷,再進行數據的封裝

最好的方式 所有邏輯判斷和代碼都由SQL(一個函數!)替代

方式1-邏輯判斷

**

具體請看我的博客

**

列表已經查出來,當時也很笨的進行了邏輯判斷,對於我這種邏輯混亂的人來說,頭疼

各種if,然後各種bug、數據錯亂等問題,瘋了

然後問了下隔壁的DB,丟給我一個函數

方式2-SQL處理

OVER(PARTITION BY)函數 開窗函數,Oracle從8.1.6開始提供分析函數,分析函數用於計算基於組的某種聚合值 它和聚合函數的不同之處是:對於每個組返回多行,而聚合函數對於每個組只返回一行 開窗函數指定了分析函數工作的數據窗口大小,這個數據窗口大小可能會隨着行的變化而變化

搭配ROW_NUMBER() OVER ()使用效果絕佳!

	SELECT ROW_NUMBER
		() OVER ( PARTITION BY rybh ORDER BY jdrq DESC, crt_time DESC ) bj,
		jdrq,	
		crt_time 
	FROM
		table

**

具體請看我的博客

**

紅框處,按照人員編號進行分組,並且按照登記日期和創建時間進行降序

那麼相同人員的數據,第一條永遠是最新的!

那麼bj=1即爲有效,否則無效,就是這麼厲害!解決了多少行代碼!!!


完整SQL:

WITH cs AS (
	SELECT ROW_NUMBER
		() OVER ( PARTITION BY b.rybh ORDER BY b.jdrq DESC, b.crt_time DESC ) bj,
		b.ID,
		b.rybh,
		f_b_getryxm ( b.rybh ) AS xm,
		f_b_formatdatestr ( b.jdrq, 'yyyy-mm-dd' ) AS jdrq,
		b.crt_time 
	FROM
		t_d_k_wsgl_bgqzcs b
		LEFT JOIN t_d_ryxx r ON b.rybh = r.rybh 
	) SELECT ROW_NUMBER
	() OVER ( ORDER BY jdrq DESC, crt_time DESC ) rn,
	ID,
	rybh,
	xm,
	jdrq,
	crt_time,
CASE
		bj 
		WHEN 1 THEN
		'有效' ELSE'無效' 
	END sfyx 
FROM
	cs 
	-- 	WHERE bj = 1

**

具體請看我的博客

**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章