sql - 在sql中加入具有不同时间戳间隔的数据
问题描述
我有两张彼此不同的桌子。第一个表有这种形式
Date1 NGVolA
2020-11-20 12:05:19.000 10461
2020-11-20 12:14:11.000 15692
2020-11-20 12:25:53.000 20627
第二张表有这种形式
char_time disch_time FUR char_temp disch_temp
2020-11-20 12:06:56.600 2020-11-20 12:08:28.193 A 59 1150
2020-11-20 12:07:02.693 2020-11-20 12:09:12.177 B 61 1140
2020-11-20 12:12:18.350 2020-11-20 12:13:46.350 A 77 1160
2020-11-20 12:16:16.070 2020-11-20 12:20:38.333 A 49 1156
2020-11-20 12:19:15.520 2020-11-20 12:21:22.317 A 75 1180
2020-11-20 12:27:10.513 2020-11-20 12:30:41.287 B 147 1165
2020-11-20 12:30:11.593 2020-11-20 12:32:33.257 A 72 1195
我想要的是从第二个表中获取数据并根据第一个表的时间间隔聚合它们。例如,在第一个表的 12:05:19 和 12:10:19 之间的时间间隔中,找出发生了多少 char_time 事件并平均它们的 char_temp。同样适用于 disch_time 和 disch_temp。
我想要的是一张这样的桌子
Date1 Avg_Char_Temp_A Char_events_A Disch_events_A Avg_DisCh_Temp_A NGVolA FUR
2020-11-20 12:05:19.000 68 2.0 1.0 1155 10461 A
2020-11-20 12:14:11.000 62 2.0 2.0 1168 15692 A
2020-11-20 12:25:53.000 72 1.0 1.0 1195 20627 A
到目前为止我所做的是
DECLARE @StartDate nvarchar(20)
DECLARE @EndDate nvarchar(20)
SET @StartDate ='2020-11-20 12:00:00'
SET @EndDate = '2020-11-20 23:59:59'
SELECT
[Date1]= a.[_TimeStamp],
[Avg_Charg_Temp_A]=avg(CASE WHEN b.[FURNACE] ='A' then convert(real,isnull (b.[charge_temperature],'0.0')) else null end),
[Char_events_A]=sum(case when b.[FURNACE] ='A' then 1.0 else null end),
[Disch_events_A]=sum(case when b.[FURNACE] ='A' then 1.0 else null end)
[Avg_DisCh_Temp_A]=avg(CASE WHEN b.[FURNACE] ='A' then convert(real,isnull (b.[ave_disch_temp],'0.0')) else null end),
[NGVolA]=sum(CASE WHEN a.[Furnace] ='A' then convert(real,isnull (a.[NG_AVG_MEAS_FLOW],'0.0')) else 0.0 end )
FROM (select a.*, (select min(aa.[_TimeStamp])
from fix.dbo.IBA_Data aa
where aa.[_TimeStamp] > a.[_TimeStamp])as next_time_2
from fix.dbo.IBA_Data a) a
Left JOIN ADB.dbo.Temp_Aims b on b.[charge_time] >= a.[_TimeStamp] and b.[charge_time] < a.[next_time_2]
WHERE
CONVERT(datetime, a.[_TimeStamp], 20) BETWEEN CONVERT(datetime, @StartDate , 20) AND CONVERT(datetime, @EndDate , 20)
GROUP BY
a.[_TimeStamp],
ORDER BY
a.[_TimeStamp]
上述查询的问题是 Char_events_A 和 Disch_events_A 被高估(我得到了我期望的两倍)并且我无法在 _TimeStamp 上聚合 Avg_DisCh_Temp_A,因此我无法计算 Avg_DisCh_Temp_A。另请记住,我获取数据的服务器具有 SQL Server 2000 的兼容性级别。任何建议将不胜感激。
@Chuma 我收到一个错误“'MasterDetailLink' 不是可识别的 GROUP BY”和“'WorkingData' 附近的语法不正确。”
With MasterDetailLink as
(select
a.[_TimeStamp], a.[NGVolA], b.[charge_time], b.[discharge_time]
from fix.dbo.Fce_IBA_Data a inner join ALPHADB.dbo.Mill_Temp_Aims b on a.[_TimeStamp] between b.[charge_time] and b.[discharge_time] ),
WorkingData as
(select
a.[_TimeStamp], a.[NGVolA], b.*
from MasterDetailLink a inner join ALPHADB.dbo.Mill_Temp_Aims b on a.[charge_time]=b.[charge_time] and a.[charge_time]=b.[discharge_time] )
select
a.[_TimeStamp],
[Avg_Charg_Temp_A]=avg(CASE WHEN b.[FURNACE] ='A' then convert(real,isnull (b.[charge_temperature],'0.0')) else null end),
[Char_events_A]=sum(case when b.[FURNACE] ='A' then 1.0 else null end),
[Disch_events_A]=sum(case when b.[FURNACE] ='A' then 1.0 else null end),
[Avg_DisCh_Temp_A]=avg(CASE WHEN b.[FURNACE] ='A' then convert(real,isnull (b.[ave_disch_temp],'0.0')) else null end),
[NGVolA]=sum(CASE WHEN a.[Furnace] ='A' then convert(real,isnull (a.[NG_AVG_MEAS_FLOW],'0.0')) else 0.0 end )
from WorkingData
group by a.[charge_time]
With MasterDetailLink as
(
select a.[charge_time], a.[NGVolA], b.[charge_time], b.[discharge_time]
from fix.dbo.Fce_IBA_Data a inner join ALPHADB.dbo.Mill_Temp_Aims b on a.[_TimeStamp] between b.[charge_time] and b.[discharge_time] )
WorkingData as
(
select
a.[_TimeStamp], a.[NGVolA], b.*
from MasterDetailLink a inner join ALPHADB.dbo.Mill_Temp_Aims b on a.[charge_time]=b.[charge_time] and a.[charge_time]=b.[discharge_time])
select
a.[_TimeStamp],
[Avg_Charg_Temp_A]=avg(CASE WHEN b.[FURNACE] ='A' then convert(real,isnull (b.[charge_temperature],'0.0')) else null end),
[Char_events_A]=sum(case when b.[FURNACE] ='A' then 1.0 else null end),
[Disch_events_A]=sum(case when b.[FURNACE] ='A' then 1.0 else null end),
[Avg_DisCh_Temp_A]=avg(CASE WHEN b.[FURNACE] ='A' then convert(real,isnull (b.[ave_disch_temp],'0.0')) else null end),
[NGVolA]=sum(CASE WHEN a.[Furnace] ='A' then convert(real,isnull (a.[NG_AVG_MEAS_FLOW],'0.0')) else 0.0 end )
from WorkingData
group by a.[_TimeStamp]
解决方案
为此,为简单起见,我们将逐步分解。我们最初的任务应该是链接父表和子表之间的时间。由于我没有他们的真实姓名,我将称他们为大师和细节。所以在主与细节中连接时代
With MasterDetailLink as
(
select a.Date1, a.NGVolA, b.char_time, b.disch_time
from master a inner join detail b
on a.Date1 between b.char_time and b.disch_time
)
现在我们将其加入常规详细信息表并从那里开始
WorkingData as
(
select a.Date1, a.NGVolA, b.*
from MasterDetailLink a
inner join detail b on a.char_time=b.char_time and a.char_time=b.disch_time
)
然后从那里,您可以进行所需的任何聚合。
select Date1, <Aggregations here e.g. Sum(field1)>
from WorkingData
group by Date1
把它们放在一起
With MasterDetailLink as
(
select a.Date1, a.NGVolA, b.char_time, b.disch_time
from master a inner join detail b
on a.Date1 between b.char_time and b.disch_time
), WorkingData as
(
select a.Date1, a.NGVolA, b.*
from MasterDetailLink a
inner join detail b on a.char_time=b.char_time and a.char_time=b.disch_time
)
select Date1, <Aggregations here e.g. Sum(field1)>
from WorkingData
group by Date1
推荐阅读
- c# - 在不使用 WMI 的情况下提取云端硬盘数据
- django - 如何将 CLOSESPIDER_ITEMCOUNT 与 scrapyd 一起使用?
- react-native - Expo / ReactNative - React Navigation - 条件认证流程
- python - 我试图让我的 discord.py 机器人在执行后立即删除一个 ping,但它不起作用
- mysql - 如何显示一个月内每一天的多个结果计数
- php - 多类别架构中的表格
- python - 没有这样的元素例外。无法在 selenium python 中找到元素
- laravel - 如何设置语言环境和重定向逻辑 Laravel 5
- facebook-graph-api - API Messenger 从平台 instagram 获取对话
- strategy-pattern - 使用策略模式删除 if-else 代码