|
给定Oracle中的三个表Dates(日期aDate,doUse布尔值),Days(rangeId整数,day整数,qty整数)和Range(rangeId整数,startDate日期)
9 S% \: l7 [8 S6 t' H我想加入这些,以便将范围与aDate = startDate中的日期(其中doUse = 1,每天在Days中)结合在一起。9 }. I7 f6 h; b/ e
给定一个范围,可能会执行以下操作0 ]+ a/ Z d# G: w P
SELECT rangeId, aDate, CASE WHEN doUse = 1 THEN qty ELSE 0 END AS qty, |0 E( L/ x. M( P6 D+ Y
FROM (
: O. X5 Z" m/ W3 r4 ] SELECT aDate, doUse, SUM(doUse) OVER (ORDER BY aDate) day5 o; a: }: @( k, C: `8 c' q
FROM Dates
- Q* N, k# _5 _5 v1 ~5 H& y0 y WHERE aDate >= :startDAte# m9 y) E, a, V
) INNER JOIN (/ K W# G! O; R) v2 D7 m
SELECT rangeId, day,qty4 X- e7 @% C' E2 R
FROM Days
) d: h3 {% q" m6 _: x9 W WHERE rangeId = :rangeId& E# V. y8 C4 W4 z
) USING (day)7 q2 {& {( i9 Z
ORDER BY day ASC! B" q& {7 [$ Z/ K7 D5 L" n! ~6 P
我想做的是查询范围中的所有范围,而不仅仅是一个。
9 J5 k; `# ^/ [/ T# N& C) |5 r# v问题在于联接值“ day”取决于要计算的范围startDate,这给我编写查询带来了一些麻烦。
- Z' z+ U: U1 b2 o: P4 W S6 Q请记住,“日期”表非常庞大,因此我希望避免从表中的第一个日期开始计算日期值,而每个“范围天”不应超过100天左右。
- }6 P, f5 p# }/ V, q* }编辑:样本数据$ |4 A$ \: K6 `9 ^
Dates Days4 k6 I3 W( Q" J
aDate doUse rangeId day qty
# N* b( K. r4 ]/ e" L( p" t2008-01-01 1 1 1 1# a" v! N& w( @4 d
2008-01-02 1 1 2 10
+ Y1 o3 p& U1 m2008-01-03 0 1 3 8/ j3 C4 X$ m, S) R
2008-01-04 1 2 1 2) h4 Y0 ?, H3 C% J/ ~- [
2008-01-05 1 2 2 5) n2 [$ ~$ n b9 p* ^
Ranges
3 O8 T* O/ j: t' D0 m; srangeId startDate
' _$ P0 |( B% n* W# ~4 {- k1 2008-01-02& p* M9 h8 [, a! T
2 2008-01-03
* a% v+ B/ k7 A/ X; t9 h: k0 D' v& ], u& |( `
Result& A4 w) t7 j" U9 W- k
rangeId aDate qty. B& _2 i. R0 M
1 2008-01-02 1
! Q9 ~5 c3 {' H; ` W9 y4 c1 2008-01-03 0
9 x) D) M4 v, V8 q/ o1 2008-01-04 10
. W, C, {" L0 x \. O) @1 2008-01-05 82 r$ W( I1 N, i" p9 \3 `2 u0 O$ _
2 2008-01-03 0
3 e8 f5 O0 L; I; B! G2 2008-01-04 2" V/ t; a7 ~& ]7 K
2 2008-01-05 5
/ _" Z9 O# @% f: D: e1 M
9 C( I; b" h7 ~" e1 v解决方案: |
|