select每个设备的Max记录,第10天记录

select the Max record for each device, which was recorded on 10th day

我有一个 table tblActiveList,它有“DeviceID”和“TimeAdded”列,另一个 table tblActiveBladeLive 有 DeviceID、RecordedDate 和 Angle 列 我如何才能 select 在第 10 天记录的每个设备的最大角度(每个设备在任何一天都可以有多个角度)?

这是我对 select 添加设备第 10 天的查询

Select DeviceID, TimeAdded, TimeAdded+10 as '10TH_Day' from tblActiveList

DeviceID    TimeAdded                 10TH_Day
BL000343    2018-08-08 15:09:54.483   2018-08-18 15:09:54.483
BL000247    2018-08-08 17:03:57.593   2018-08-18 17:03:57.593

这是第 2 个 table,添加了 Day 设备后几个月的所有角度。

Select DeviceID, RecordedDate, Angle from tblActiveBladeLive

DeviceID    RecordedDate            Angle
BL000343    2018-08-15 23:55:13.000 11.50
BL000343    2018-08-16 22:54:58.000 12.55
BL000343    2018-08-16 21:54:58.000 12.55
BL000343    2018-08-17 23:54:59.000 13.15
BL000343    2018-08-18 05:54:59.000 15.15
BL000343    2018-08-18 01:54:59.000 13.15
BL000247    2018-08-17 03:44:57.000 15.78
BL000247    2018-08-18 06:46:41.000 15.05
BL000247    2018-08-17 11:46:56.000 15.05
BL000247    2018-08-18 05:46:41.000 14.05

这是需要select编辑的记录

DeviceID    RecordedDate            Angle
BL000343    2018-08-18 05:54:59.000 15.15
BL000247    2018-08-18 06:46:41.000 15.05

任何帮助将不胜感激。

我对你的数据和你要找的东西有点困惑。您需要做的是使用 JOIN、CTE,可能至少使用一次 GROUP BY。很可能是相关子查询。如果您可以更好地改写您的问题,那将会有所帮助。如果您知道,还请添加您正在使用的 SQL 引擎。

我会这样做:

SELECT A.DeviceID, MAX(RecordedDate) AS RecordedDate, A.Angle
FROM (SELECT tblActiveList.DeviceID, CONVERT(date,DATEADD(d,10,TimeAdded)) AS Day10, MAX(Angle) AS Angle
        FROM tblActiveList
            LEFT JOIN tblActiveBladeLive ON tblActiveList.DeviceID=tblActiveBladeLive.DeviceID AND CONVERT(date,DATEADD(d,10,TimeAdded))=CONVERT(date,RecordedDate)
        GROUP BY tblActiveList.DeviceID, TimeAdded) A
    LEFT JOIN tblActiveBladeLive B ON A.DeviceID=B.DeviceID AND A.Angle=B.Angle AND Day10=CONVERT(date,RecordedDate)
GROUP BY A.DeviceID, A.Angle

这是在没有测试环境的情况下编写的,因此可能存在拼写错误和错误。第10天很容易达到最大角度。困难的部分是获取与之对应的时间戳。如果你不关心时间部分,只关心最终结果中的日期部分,它会变得更简单:

SELECT tblActiveList.DeviceID, CONVERT(date,DATEADD(d,10,TimeAdded)) AS Day10, MAX(Angle) AS Angle
FROM tblActiveList
    LEFT JOIN tblActiveBladeLive ON tblActiveList.DeviceID=tblActiveBladeLive.DeviceID AND CONVERT(date,DATEADD(d,10,TimeAdded))=CONVERT(date,RecordedDate)
GROUP BY tblActiveList.DeviceID, TimeAdded

已编辑 1。出现问题。

试试这个。看起来像上面提到的相同方法,但也许它有用:

WITH device_10thDay as
(
Select 
    DeviceID, CONVERT(VARCHAR(10), DATEADD(day, 10, TimeAdded), 103) as 'Tenth_Day' 
from tblActiveList
)

Select 
    tenDays.DeviceID, 
    CONVERT(VARCHAR(10), RecordedDate, 103) as RecordedDate, 
    MAX(Angle) as Angle
from device_10thDay tenDays 
left JOIN tblActiveBladeLive tbl on tenDays.DeviceID = tbl.DeviceID and tenDays.Tenth_Day = CONVERT(VARCHAR(10), RecordedDate, 103) 
group by 
    tenDays.DeviceID, 
    CONVERT(VARCHAR(10), RecordedDate, 103)
SELECT 
    DeviceID 
,   RecordedDate
,   Angle
FROM (
SELECT 
    tab.DeviceID
,   tab.RecordedDate
,   tab.Angle
,   ROW_NUMBER() OVER(PARTITION BY tab.DeviceID ORDER BY RecordedDate DESC) MaxRN  
FROM @tblActiveBladeLive tab
LEFT JOIN  @tblActive ta 
    ON ta.DeviceID = tab.DeviceID 
    AND ta.TimeAdded <= tab.RecordedDate 
    AND CAST(DATEADD(DAY, 10,CAST(TimeAdded AS DATE) ) AS DATETIME) + ' 23:59:59' >= tab.RecordedDate 
) D
WHERE 
    MaxRN = 1 

注:

CAST(DATEADD(DAY, 10,CAST(TimeAdded AS DATE) ) AS DATETIME) + ' 23:59:59'

Casting TimeAdded to Date 并添加 10 天然后给它时间 23:59:59 以确保我们将在第 10 天获得所有记录。

您可以使用正确的日期更新 tblActiveList table。这将使事情更有效,更容易长期使用。

当同一日期有多个角度读数时,我认为您接受的答案不会处理平局。这是使用行编号的典型方法。

with MaxAngle as (
    select DeviceID, RecordedDate, Angle,
        row_number() over
            (partition by DeviceID, cast(RecordedDate as date) order by Angle desc) as rn
    from tblActiveBladeLive
)
select *
from tblActiveList as l left outer join MaxAngle as a
    on      a.DeviceID = l.DeviceID
        and cast(dateadd(day, 10, a.TimeAdded) as date) = cast(l.RecordedDate as date)
        and a.rn = 1;