Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为每个设备选择在第10天记录的最大记录_Sql_Sql Server_Sql Server 2017 - Fatal编程技术网

Sql 为每个设备选择在第10天记录的最大记录

Sql 为每个设备选择在第10天记录的最大记录,sql,sql-server,sql-server-2017,Sql,Sql Server,Sql Server 2017,我有一个表tblActiveList,其中包含“DeviceID”和“TimeAdded”列,还有一个表TBlactiveBladelivere,其中包含DeviceID、RecordedDate和Angle列 我如何为每个设备选择最大角度,这是在第10天录制的(每个设备在任何一天都可以有多个角度) 这是我的查询,选择添加设备的第10天 Select DeviceID, TimeAdded, TimeAdded+10 as '10TH_Day' from tblActiveList Devic

我有一个表tblActiveList,其中包含“DeviceID”和“TimeAdded”列,还有一个表TBlactiveBladelivere,其中包含DeviceID、RecordedDate和Angle列 我如何为每个设备选择最大角度,这是在第10天录制的(每个设备在任何一天都可以有多个角度)

这是我的查询,选择添加设备的第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
这是第二张表,从设备添加之日起几个月的所有角度

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
以下是需要选择的记录

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,可能是
groupby
至少一次。很可能是相关子查询。如果你能把你的问题改好一点,那会有帮助的。如果您知道,还可以添加您正在使用的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
这是在没有测试环境的情况下编写的,因此可能存在打字错误和bug。在第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)
铸造时间增加到日期,增加10天,然后给它23:59:59的时间,以确保我们将在第10天获得所有记录


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

我认为,如果同一日期有多个角度读数,您接受的答案将无法处理关系。下面是使用行编号的典型方法

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;

您正在有效地使用哪个数据库?。。日期-时间函数针对每个db品牌(SQL是一种查询语言,而不是db名称)在相同的设备ID和TimeAdded+10=RecordedDate的日期部分上加入表。您的确切问题是什么?你的问题到什么程度了?你被困在哪里?你面临什么问题?正如斯吉塞奇所说:我们需要你正在使用的数据库管理系统(MySQL、SQL Server、Oracle、PostgreSQL等等)。我不理解这些数据。时间因素重要吗?如何处理同一日期的多次读数?您的样本数据在时间添加日期没有读数。如果第10天没有读数怎么办?如果设备在第10天有两次相同的最大角度,该怎么办?显示两行吗?只显示一行吗?如果只有一排,那是哪一排?点上!非常感谢这正是我想要的。就像一个符咒。是的,只要它选择最大角度(它正在选择)时间部分并不重要。您的答案也是正确的。您的答案与SunKnight0的答案之间的区别在于,您选择了第10天的最大角度值,而SunKnight0选择了第10天的角度值,这是当天最后一次录制的角度值,碰巧这两种方法对我的效果完全相同,因为第10天的最大角度值将最后录制。我希望我没有制造更多的混乱:)@ThirdPartyAuth好的,我以为你想要max angle。要实现这一点,只需更改为按RecordedDate desc排序即可。从根本上说,这是同一个问题!实际上,我的解决方案也会选择“最大角度”,不管它是否是最后一个角度。然后从与最大角度对应的时间戳中选择最大时间戳。你只需要从内到外阅读它,而不是从上到下阅读它。是的,我当时应该用另一种方式来处理角度上的领带。但是我确实忽略了外部的
组。
CAST(DATEADD(DAY, 10,CAST(TimeAdded AS DATE) ) AS DATETIME) + ' 23:59:59'
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;