**
**
偶然間讓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
**
**