您好:
想請問一般有關逐日當登錄的紀錄
比如
前日用電量,本日用電量,使用電量
前日用水量,本日用水量,使用水量
這樣的資料表,
再DB端,要如何建構,效能及維護 會較好?
因為還需要 有報表呈現
日期 ,前日電表 ,本日電表,電使用 ,前日水量,本日水量,水使用
20240909 ,100.00 , 120.05 ,20.05 ,200.01 , 201.01 ,1.00
20240910 ,120.05 , 140.05 ,20.00 ,201.01 , 2022.01 ,1.00
目前想直接用此架構來做
也有想 這樣,但整個呈現或計算,就要再 做遞迴取抓資料
日期 ,本日電表,本日水量
20240909 , 120.05 , 201.01
所以想請,前輩們,是否有較好的建議
謝謝
======================== 篩選條件
Force提供的範例
https://stackoverflow.com/questions/58665010/sql-shift-column-down-1-row
create table aa (
a1 varchar(20), --日期
a2 int, --類別:1.電,2水
a3 float, --度數
);
insert into aa
Values
('2021-05-09',1,2376.1),
('2021-05-10',1,2396.4),
('2021-05-11',1,2403.9),
('2021-05-12',1,2413.8),
('2021-05-13',1,2415.6),
('2021-05-10',2,12396.5),
('2021-05-11',2,12453.8),
('2021-05-12',2,12493.3),
('2021-05-13',2,12515.7),
('2021-05-14',2,12625.2);
WITH CTE01 AS (
SELECT a1 AS 'XDate',a2 AS 'XType',
lag(a3, 1, a3) OVER (PARTITION BY a2 ORDER BY a2,A1) as 'PreDegree',
a3 AS 'Degree',
ROUND(a3-lag(a3, 1, a3) OVER (PARTITION BY a2 ORDER BY a2,A1),2) AS 'Qty'
FROM aa
)
SELECT Distinct S.XDate,
P.PreDegree AS P_PreDegree,P.Degree AS P_Degree,P.Qty AS P_Qty,
W.PreDegree AS W_PreDegree,W.Degree AS W_Degree,W.Qty AS W_Qty
FROM CTE01 AS S
LEFT JOIN CTE01 AS P ON P.XDate=S.XDate AND P.XType = 1
LEFT JOIN CTE01 AS W ON W.XDate=S.XDate AND W.XType = 2
-- WHERE S.XDate>= '2021-05-11' and S.XDate<= '2021-05-13'
ORDER BY S.XDate
您好:
所以 目前常用的作法是
少欄位, 再去撈出資料?
因為較好奇的是,比如 有兩個抄表欄位 (要手動加擴充欄位)
1.直接把拉滿,後續直接看
日期,水前日,水當日,使用水,電前日,電當日,使用電
2.只有抄表欄位 (類別可擴充性)
日期, 水/電類別,抄表值
要看時,再用VIEW 來看
這樣 當欄位多時(20個項目),日期量多時 會差多少
謝謝
不是很 catch 到你的意思
但如果是要減少運算的問題
使用 computed pattern 去設計或許是一個方式
並且在 query 一段時間區間的資料時
在資料本身加入對應使用參數的 index 也是一個簡單可以大幅增加效能的方式
善加使用正確的 query 語法也可以大幅優化效能