首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自联接T获取超过1小时的数据

使用自联接T获取超过1小时的数据
EN

Stack Overflow用户
提问于 2017-11-08 18:49:04
回答 2查看 202关注 0票数 0

我有张这样的桌子(claimsTable),

代码语言:javascript
复制
 Time              Terminal_ID  Claims data_from
------------------------------------------------

2017-10-19 06:03:00     1        561     2
2017-10-19 06:04:00     1        562     2 
2017-10-19 06:05:00     1        562.3   2
2017-10-19 06:06:00     1        563     2
2017-10-19 06:03:00     9        471     2
2017-10-19 06:04:00     9        471.9   2
2017-10-19 06:05:00     9        472.3   2
2017-10-19 06:06:00     9        473     2
2017-10-19 06:07:00     1        567     1
2017-10-19 06:08:00     1        567.6   1 
2017-10-19 06:09:00     1        568.2   1
2017-10-19 06:10:00     1        569     1
2017-10-19 06:07:00     9        475     1
2017-10-19 06:08:00     9        475.9   1
2017-10-19 06:09:00     9        476.3   1
2017-10-19 06:10:00     9        476.3   1

对于每个ID,都有价值天的数据。我只展示了上面的一些数据。现在,我检查来自data_from =1的每个data_from的最老数据,如下所示

代码语言:javascript
复制
select min(Time), Terminal_ID
from claimsTable 
where data_from = 1 
group by Terminal_ID

我得到每个ID的2017-10-19 06:07:00

接下来,我检查来自data_from =2的每个data_from的最新数据,如下所示,

代码语言:javascript
复制
select max(Time), Terminal_ID 
from claimsTable 
where data_from = 2
group by Terminal_ID

现在,我得到了每个2017-10-19 06:06:00Terminal_ID

现在,我想从最新的时间( data_from =2的最大值(时间))中得到60分钟的数据,以从data_from = 1的最老数据中计算每小时的avg。

所以,我做了这样的自我连接检查,

代码语言:javascript
复制
select 
      t1.[Time], t1. Terminal_ID
from 
    claimsTable t1
inner join 
    claimsTable t2
    on t1.Terminal_ID = t2. Terminal_ID
where t1. Terminal_ID = t2. Terminal_ID and 
      t1.[Time] between dateadd(mi,-59,t2.[Time]) and t1.[Time]

这没有给出所需的检查,因为我没有在t2中使用t2函数,在t1中使用min函数。当我做一个自我连接时,我不知道如何将它们包括在内。

我的预期输出表:

代码语言:javascript
复制
Time              Terminal_ID  Claims data_from
------------------------------------------------
2017-10-19 06:03:00     1        561     2
2017-10-19 06:04:00     1        562     2 
2017-10-19 06:05:00     1        562.3   2
2017-10-19 06:06:00     1        563     2
2017-10-19 06:07:00     1        567     1
2017-10-19 06:03:00     9        471     2
2017-10-19 06:04:00     9        471.9   2
2017-10-19 06:05:00     9        472.3   2
2017-10-19 06:06:00     9        473     2
2017-10-19 06:07:00     9        475     1

如何检查从data_from= 2开始最老的数据,即data_from = 1的前60分钟的数据?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-08 20:35:34

我已经尝试过计算Avgmintime(data_from = 1 )(Max - 60 mins AND data_from == 2)之间的所有记录。

问题是,我在这两种情况下都得到了NULL,这可能是因为查询中缺少了什么-或者数据不够。

如果有任何问题请告诉我,请试着运行查询。

这是创建示例数据的查询和查询:

代码语言:javascript
复制
    -- CREATE SAMPLE DATA
    DROP TABLE #claimsTable

    CREATE TABLE #claimsTable
    (
        [Time] DateTime,
        Terminal_ID INT,
        Claims FLOAT,
        data_from INT

    )

    INSERT INTO #claimsTable
    VALUES

        (N'2017-10-19 06:03:00',     1 ,       561  ,   2),
        (N'2017-10-19 06:04:00',     1 ,       562  ,   2), 
        (N'2017-10-19 06:05:00',     1 ,       562.3,   2),
        (N'2017-10-19 06:06:00',     1 ,       563  ,   2),
        (N'2017-10-19 06:03:00',     9 ,       471  ,   2),
        (N'2017-10-19 06:04:00',     9 ,       471.9,   2),
        (N'2017-10-19 06:05:00',     9 ,       472.3,   2),
        (N'2017-10-19 06:09:00',     9 ,       473  ,   2),
        (N'2017-10-19 06:07:00',     1 ,       567  ,   1),
        (N'2017-10-19 06:08:00',     1 ,       567.6,   1), 
        (N'2017-10-19 06:09:00',     1 ,       568.2,   1),
        (N'2017-10-19 06:10:00',     1 ,       569  ,   1),
        (N'2017-10-19 06:05:00',     9 ,       475  ,   1),
        (N'2017-10-19 06:08:00',     9 ,       475.9,   1),
        (N'2017-10-19 06:09:00',     9 ,       476.3,   1)

我在示例数据中更改1或2次,以更好地理解我的查询所生成的结果。

实际的查询从这里开始:

代码语言:javascript
复制
    Select
        A.TerminalId,
        Avrg = AVG(data_between.Claims)
    From
        (
        -- this inner query returns
        /*
            TerminalId  |           MaxTime (data_from == 2)    |   Min Time (data_from == 1)
            -------------------------------------------------------------------------------------
            9           |   2017-10-19 06:09:00.000             |   2017-10-19 06:05:00.000
            1           |   2017-10-19 06:06:00.000             |   2017-10-19 06:07:00.000
        */

            Select
                TerminalId = data_from_2.Terminal_ID,
                MaxTime2 = MAX(data_from_2.[Time]),
                MinTime1 = data_from_1.[Time]

            From
                #claimsTable data_from_2
                -- This will get MIN the data_from = 1 for each terminal_id
                CROSS APPLY (
                    SELECT TOP (1) 
                        * 
                    FROM #claimsTable  a

                    WHERE a.data_from = 1 AND a.Terminal_ID = data_from_2.Terminal_ID

                    ORDER BY a.[Time] ASC

                ) data_from_1
            --
            Where data_from_2.data_from = 2
            -- group by to get the Max.Time for each terminal
            GROUP BY data_from_2.Terminal_ID, data_from_1.[Time]
        ) A

        -- join with claimsTable again to get the data between mintime(data_from = 1 ) and (Max - 60 mins) so we can calculate avg

        LEFT JOIN #claimsTable data_between on data_between.Terminal_ID = A.TerminalId AND data_between.[Time] BETWEEN A.MinTime1 AND DATEADD(MINUTE, -60, A.MaxTime2)
        --
        GROUP BY A.TerminalId
票数 1
EN

Stack Overflow用户

发布于 2017-11-08 18:56:40

只需在自联接的time列上使用max函数即可。

代码语言:javascript
复制
select 
      max(t2.[Time]), 
      t1.Terminal_ID
from 
    claimsTable t1
full join 
    claimsTable t2
    on t1.Terminal_ID = t2. Terminal_ID
    and t2.time <= dateadd(mi,-59,t1.[Time]) 
group by
    t1. Terminal_ID
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47187431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档