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;
我有一个 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;