我有一个复杂的查询,我正在努力。您会注意到架构不是最容易使用的,但它是我给予的,没有时间重新设计(常见故事!)。
我有类似下面的行。注意:3位数value
数字只是我编写的随机数。
id field_id value
1 5 999
1 6 888
1 7 777
1 8 foo <--- foo so we want the 3 values above
1 9 don't care
2 5 123
2 6 456
2 7 789
2 8 bar <--- bar so we DON'T want the 3 values above
2 9 don't care
3 5 623
3 6 971
3 7 481
3 8 foo <--- foo so we want the 3 values above
3 9 don't care
...
...
n 5 987
n 6 654
n 7 321
n 8 foo <--- foo so we want the 3 values above
n 9 don't care
我想要这个结果:
id result
1 999*888*777
3 623*971*481
...
n 987*654*321
这是否清楚?所以我们有一个n*5
行的表。对于5
行中的每一组3
行,1
都有我们可能想要相乘的值,1
它们告诉我们 if 我们想要倍增以及我们不关心的{{1}}因此我们不希望查询结果中的行。
我们可以在Oracle中这样做吗?最好是一个查询..我猜你需要使用乘法运算符(不知何故)和分组。
任何帮助都会很棒。谢谢。
答案 0 :(得分:2)
类似的东西:
select m.id, exp(sum(ln(m.value)))
from mytab m
where m.field_id in (5, 6, 7)
and m.id in (select m2.id
from mytab m2
where m2.field_id = 8
and m2.value = 'foo')
group by m.id;
例如:
SQL> select * from mytab;
ID FIELD_ID VAL
---------- ---------- ---
1 5 999
1 6 888
1 7 777
1 8 foo
1 9 x
2 5 123
2 6 456
2 7 789
2 8 bar
2 9 x
3 5 623
3 6 971
3 7 481
3 8 foo
3 9 x
15 rows selected.
SQL> select m.id, exp(sum(ln(m.value))) result
2 from mytab m
3 where m.field_id in (5, 6, 7)
4 and m.id in (select m2.id
5 from mytab m2
6 where m2.field_id = 8
7 and m2.value = 'foo')
8 group by m.id;
ID RESULT
---------- ----------
1 689286024
3 290972773
答案 1 :(得分:0)
相同的逻辑;刚刚删除了硬编码值。发布这个答案思考可能对其他人有帮助。
SELECT a.id,
exp(sum(ln(a.val)))
FROM mytab a,
(SELECT DISTINCT id,
field_id
FROM mytab
WHERE val = 'foo') b
WHERE a.id = b.id
AND a.field_id < b.field_id
GROUP BY a.id;