创建包含 MAX() 值的 SUM() 和条件的查询
Creating a query containing a SUM() of MAX() values with conditions
我有两个表:
仪表(浓缩)
id Meter_Id Date Time Consumption
1 1 2016-01-01 0.5 0.0769
2 1 2016-01-01 1.0 0.0649
3 1 2016-01-01 1.5 0.0379
4 1 2016-01-01 2.0 0.0439
5 1 2016-01-01 2.5 0.045
6 1 2016-01-01 3.0 0.034
7 1 2016-01-01 3.5 0.0419
8 1 2016-01-01 4.0 0.0399
9 1 2016-01-01 4.5 0.0329
10 1 2016-01-01 5.0 0.045
11 1 2016-01-01 5.5 0.035
12 1 2016-01-01 6.0 0.035
13 1 2016-01-01 6.5 0.0439
14 1 2016-01-01 7.0 0.0309
15 1 2016-01-01 7.5 0.039
16 1 2016-01-01 8.0 0.041
17 1 2016-01-01 8.5 0.032
18 1 2016-01-01 9.0 0.0399
19 1 2016-01-01 9.5 0.039
20 1 2016-01-01 10.0 0.032
21 1 2016-01-01 10.5 0.039
22 1 2016-01-01 11.0 0.0399
23 1 2016-01-01 11.5 0.032
24 1 2016-01-01 12.0 0.041
25 1 2016-01-01 12.5 0.039
26 1 2016-01-01 13.0 0.032
27 1 2016-01-01 13.5 0.676
28 1 2016-01-01 14.0 0.0379
29 1 2016-01-01 14.5 0.0329
30 1 2016-01-01 15.0 0.0419
31 1 2016-01-01 15.5 0.0379
32 1 2016-01-01 16.0 0.032
33 1 2016-01-01 16.5 0.046
34 1 2016-01-01 17.0 0.035
35 1 2016-01-01 17.5 0.037
36 1 2016-01-01 18.0 0.0469
37 1 2016-01-01 18.5 0.032
38 1 2016-01-01 19.0 0.0399
39 1 2016-01-01 19.5 0.041
40 1 2016-01-01 20.0 0.0309
41 1 2016-01-01 20.5 0.043
42 1 2016-01-01 21.0 0.037
43 1 2016-01-01 21.5 0.0329
44 1 2016-01-01 22.0 0.0439
45 1 2016-01-01 22.5 0.0329
46 1 2016-01-01 23.0 0.034
47 1 2016-01-01 23.5 0.043
48 1 2016-01-01 24.0 0.032
49 1 2016-01-02 0.5 0.032
50 1 2016-01-02 1.0 0.0439
51 1 2016-01-02 1.5 0.0309
52 1 2016-01-02 2.0 0.034
53 1 2016-01-02 2.5 0.0419
54 1 2016-01-02 3.0 0.0309
55 1 2016-01-02 3.5 0.035
56 1 2016-01-02 4.0 0.041
57 1 2016-01-02 4.5 0.0299
58 1 2016-01-02 5.0 0.3049
59 1 2016-01-02 5.5 0.446
60 1 2016-01-02 6.0 0.0299
61 1 2016-01-02 6.5 0.0299
62 1 2016-01-02 7.0 0.0419
63 1 2016-01-02 7.5 0.0329
64 1 2016-01-02 8.0 0.0299
65 1 2016-01-02 8.5 0.037
66 1 2016-01-02 9.0 0.037
67 1 2016-01-02 9.5 0.0309
68 1 2016-01-02 10.0 0.0299
69 1 2016-01-02 10.5 0.0399
70 1 2016-01-02 11.0 0.035
71 1 2016-01-02 11.5 0.0299
72 1 2016-01-02 12.0 0.037
73 1 2016-01-02 12.5 0.039
74 1 2016-01-02 13.0 0.0309
75 1 2016-01-02 13.5 0.0309
76 1 2016-01-02 14.0 0.0419
77 1 2016-01-02 14.5 0.0359
78 1 2016-01-02 15.0 0.0309
79 1 2016-01-02 15.5 0.0399
80 1 2016-01-02 16.0 0.037
81 1 2016-01-02 16.5 0.032
82 1 2016-01-02 17.0 0.0379
83 1 2016-01-02 17.5 0.041
84 1 2016-01-02 18.0 0.032
85 1 2016-01-02 18.5 0.037
86 1 2016-01-02 19.0 0.041
87 1 2016-01-02 19.5 0.0309
88 1 2016-01-02 20.0 0.039
89 1 2016-01-02 20.5 0.048
90 1 2016-01-02 21.0 0.074
91 1 2016-01-02 21.5 0.7059
92 1 2016-01-02 22.0 0.046
93 1 2016-01-02 22.5 0.0329
94 1 2016-01-02 23.0 0.035
95 1 2016-01-02 23.5 0.0399
96 1 2016-01-02 24.0 0.0329
97 1 2016-01-03 0.5 0.0299
...
关税
ID CHARGE
1 13.38
我正在尝试在某些条件下创建消耗查询:
- 它必须只查看“高峰时段”(15、15.5、16、...、19.5、20、20.5)之间的消耗值。
- 对于每一天,找到最高 (MAX) 值并乘以关税
CHARGE
。称之为 Peak_Charge
.
- 将每天的
Peak_Charge
值求和为 Total_Peak_Charge
值。
例如在上面的表格中,第 2016-01-01
天高峰时段的 MAX 是 0.0469
,第 2016-01-02
天是 0.048
。有了这些,我需要 return 一个等于 (0.0469 * 13.38) + (0.048 * 13.38)
= 1.269762
.
的 Total_Peak_Charge
值
我在写这个问题的时候想出了一个解决方案:
SELECT
Meter_Id,
Start_Date,
End_Date,
SUM(Total_Consumption) AS Total_Consumption,
SUM(Peak_Consumption) AS Total_Peak_Consumption,
SUM(Peak_Charge) AS Total_Peak_Charge
FROM (
SELECT
m.GUID,
"2016-01-01" AS Start_Date,
"2016-01-02" AS End_Date,
SUM(m.Consumption) AS Total_Consumption,
SUM(CASE WHEN m.Time >= 15 AND m.Time < 21 THEN m.Consumption ELSE 0 END) AS Peak_Consumption,
MAX(CASE WHEN m.Time >= 15 AND m.Time < 21 THEN m.Consumption ELSE 0 END) * t.CHARGE AS Peak_Charge
FROM
metering m,
tariff t
WHERE m.Meter_Id = 1 AND m.Date BETWEEN Start_Date AND End_Date AND t.ID = 1
GROUP BY m.Meter_Id, t.ID, m.Date
);
本次查询returns的正确结果为:
Meter_Id Start_Date End_Date Total_Consumption Total_Peak_Consumption Total_Peak_Charge
1 2016-01-01 2016-01-02 5.6222 0.9101 1.269762
在您的问题中,您没有阐明 Meter
与 Tariff
的关系。
如果列 Meter.meter_id
和 Tariff.id
相关,则连接表,聚合然后使用 window 函数 sum()
:
select distinct
t.charge * sum(max(m.Consumption)) over () Total_Peak_Charge
from Meter m inner join Tariff t
on t.id = m.meter_id
where m.Time between 15.0 and 20.5
group by m.Date
如果 2 个表不相关且 Tariff 仅包含 1 行,则:
select distinct
(select charge from Tariff) * sum(max(Consumption)) over () Total_Peak_Charge
from Meter
where Time between 15.0 and 20.5
group by Date;
参见demo。
结果:
| Total_Peak_Charge |
| ----------------- |
| 1.269762 |
我有两个表:
仪表(浓缩)
id Meter_Id Date Time Consumption
1 1 2016-01-01 0.5 0.0769
2 1 2016-01-01 1.0 0.0649
3 1 2016-01-01 1.5 0.0379
4 1 2016-01-01 2.0 0.0439
5 1 2016-01-01 2.5 0.045
6 1 2016-01-01 3.0 0.034
7 1 2016-01-01 3.5 0.0419
8 1 2016-01-01 4.0 0.0399
9 1 2016-01-01 4.5 0.0329
10 1 2016-01-01 5.0 0.045
11 1 2016-01-01 5.5 0.035
12 1 2016-01-01 6.0 0.035
13 1 2016-01-01 6.5 0.0439
14 1 2016-01-01 7.0 0.0309
15 1 2016-01-01 7.5 0.039
16 1 2016-01-01 8.0 0.041
17 1 2016-01-01 8.5 0.032
18 1 2016-01-01 9.0 0.0399
19 1 2016-01-01 9.5 0.039
20 1 2016-01-01 10.0 0.032
21 1 2016-01-01 10.5 0.039
22 1 2016-01-01 11.0 0.0399
23 1 2016-01-01 11.5 0.032
24 1 2016-01-01 12.0 0.041
25 1 2016-01-01 12.5 0.039
26 1 2016-01-01 13.0 0.032
27 1 2016-01-01 13.5 0.676
28 1 2016-01-01 14.0 0.0379
29 1 2016-01-01 14.5 0.0329
30 1 2016-01-01 15.0 0.0419
31 1 2016-01-01 15.5 0.0379
32 1 2016-01-01 16.0 0.032
33 1 2016-01-01 16.5 0.046
34 1 2016-01-01 17.0 0.035
35 1 2016-01-01 17.5 0.037
36 1 2016-01-01 18.0 0.0469
37 1 2016-01-01 18.5 0.032
38 1 2016-01-01 19.0 0.0399
39 1 2016-01-01 19.5 0.041
40 1 2016-01-01 20.0 0.0309
41 1 2016-01-01 20.5 0.043
42 1 2016-01-01 21.0 0.037
43 1 2016-01-01 21.5 0.0329
44 1 2016-01-01 22.0 0.0439
45 1 2016-01-01 22.5 0.0329
46 1 2016-01-01 23.0 0.034
47 1 2016-01-01 23.5 0.043
48 1 2016-01-01 24.0 0.032
49 1 2016-01-02 0.5 0.032
50 1 2016-01-02 1.0 0.0439
51 1 2016-01-02 1.5 0.0309
52 1 2016-01-02 2.0 0.034
53 1 2016-01-02 2.5 0.0419
54 1 2016-01-02 3.0 0.0309
55 1 2016-01-02 3.5 0.035
56 1 2016-01-02 4.0 0.041
57 1 2016-01-02 4.5 0.0299
58 1 2016-01-02 5.0 0.3049
59 1 2016-01-02 5.5 0.446
60 1 2016-01-02 6.0 0.0299
61 1 2016-01-02 6.5 0.0299
62 1 2016-01-02 7.0 0.0419
63 1 2016-01-02 7.5 0.0329
64 1 2016-01-02 8.0 0.0299
65 1 2016-01-02 8.5 0.037
66 1 2016-01-02 9.0 0.037
67 1 2016-01-02 9.5 0.0309
68 1 2016-01-02 10.0 0.0299
69 1 2016-01-02 10.5 0.0399
70 1 2016-01-02 11.0 0.035
71 1 2016-01-02 11.5 0.0299
72 1 2016-01-02 12.0 0.037
73 1 2016-01-02 12.5 0.039
74 1 2016-01-02 13.0 0.0309
75 1 2016-01-02 13.5 0.0309
76 1 2016-01-02 14.0 0.0419
77 1 2016-01-02 14.5 0.0359
78 1 2016-01-02 15.0 0.0309
79 1 2016-01-02 15.5 0.0399
80 1 2016-01-02 16.0 0.037
81 1 2016-01-02 16.5 0.032
82 1 2016-01-02 17.0 0.0379
83 1 2016-01-02 17.5 0.041
84 1 2016-01-02 18.0 0.032
85 1 2016-01-02 18.5 0.037
86 1 2016-01-02 19.0 0.041
87 1 2016-01-02 19.5 0.0309
88 1 2016-01-02 20.0 0.039
89 1 2016-01-02 20.5 0.048
90 1 2016-01-02 21.0 0.074
91 1 2016-01-02 21.5 0.7059
92 1 2016-01-02 22.0 0.046
93 1 2016-01-02 22.5 0.0329
94 1 2016-01-02 23.0 0.035
95 1 2016-01-02 23.5 0.0399
96 1 2016-01-02 24.0 0.0329
97 1 2016-01-03 0.5 0.0299
...
关税
ID CHARGE
1 13.38
我正在尝试在某些条件下创建消耗查询:
- 它必须只查看“高峰时段”(15、15.5、16、...、19.5、20、20.5)之间的消耗值。
- 对于每一天,找到最高 (MAX) 值并乘以关税
CHARGE
。称之为Peak_Charge
. - 将每天的
Peak_Charge
值求和为Total_Peak_Charge
值。
例如在上面的表格中,第 2016-01-01
天高峰时段的 MAX 是 0.0469
,第 2016-01-02
天是 0.048
。有了这些,我需要 return 一个等于 (0.0469 * 13.38) + (0.048 * 13.38)
= 1.269762
.
Total_Peak_Charge
值
我在写这个问题的时候想出了一个解决方案:
SELECT
Meter_Id,
Start_Date,
End_Date,
SUM(Total_Consumption) AS Total_Consumption,
SUM(Peak_Consumption) AS Total_Peak_Consumption,
SUM(Peak_Charge) AS Total_Peak_Charge
FROM (
SELECT
m.GUID,
"2016-01-01" AS Start_Date,
"2016-01-02" AS End_Date,
SUM(m.Consumption) AS Total_Consumption,
SUM(CASE WHEN m.Time >= 15 AND m.Time < 21 THEN m.Consumption ELSE 0 END) AS Peak_Consumption,
MAX(CASE WHEN m.Time >= 15 AND m.Time < 21 THEN m.Consumption ELSE 0 END) * t.CHARGE AS Peak_Charge
FROM
metering m,
tariff t
WHERE m.Meter_Id = 1 AND m.Date BETWEEN Start_Date AND End_Date AND t.ID = 1
GROUP BY m.Meter_Id, t.ID, m.Date
);
本次查询returns的正确结果为:
Meter_Id Start_Date End_Date Total_Consumption Total_Peak_Consumption Total_Peak_Charge
1 2016-01-01 2016-01-02 5.6222 0.9101 1.269762
在您的问题中,您没有阐明 Meter
与 Tariff
的关系。
如果列 Meter.meter_id
和 Tariff.id
相关,则连接表,聚合然后使用 window 函数 sum()
:
select distinct
t.charge * sum(max(m.Consumption)) over () Total_Peak_Charge
from Meter m inner join Tariff t
on t.id = m.meter_id
where m.Time between 15.0 and 20.5
group by m.Date
如果 2 个表不相关且 Tariff 仅包含 1 行,则:
select distinct
(select charge from Tariff) * sum(max(Consumption)) over () Total_Peak_Charge
from Meter
where Time between 15.0 and 20.5
group by Date;
参见demo。
结果:
| Total_Peak_Charge |
| ----------------- |
| 1.269762 |