朋友们,
我有一个SQL问题,可以在上面使用帮助。我正在使用SQL Server 2008。
用例如下。我们有一个用户观看视频的系统,每次用户观看视频时,我们都会记录该活动。我们每次都捕获三个属性。assetid(资产是视频),customerid和状态。
一条记录可以具有三种不同的状态。“完成”,“播放”和“开始”。
编写系统这部分内容的人不是开发人员,并且每次用户观看视频时都插入新的重复记录,而不是更新现有记录的状态。因此,我们有成千上万的重复记录。这是一个样本数据集
我需要解决的问题是按资产ID,客户ID和状态选择记录。我需要选择状态为“完成”的记录(如果存在)。
如果一条记录的状态为“正在播放”,但不存在具有相同资产标识和客户标识的状态为“完成”的记录,则选择该记录。
如果一条记录的状态为“开始”,但是不存在具有相同资产标识和客户标识的状态为“完成”或“正在播放”的记录,则选择该记录。
这是我尝试使用CASE语句解决问题的示例代码。我还尝试了另一个带有NOT IN子查询的case语句,但是没有成功。
INSERT INTO #ViewTime (AssetID, CustomerID, ViewTime)
SELECT
tt.customerid, tt.assetId, tt.assetstatus,
CASE WHEN
tt.AssetStatus = 'COMPLETION'
AND
ISNUMERIC(timeposition) = 1
THEN
CONVERT(Numeric(18,3), timePosition)
WHEN
tt.AssetStatus = 'PLAYING'
AND
ISNUMERIC(timeposition) = 1
THEN
CONVERT(Numeric(18,3), timePosition)
WHEN
tt.AssetStatus = 'START'
AND
ISNUMERIC(timeposition) = 1
THEN
CONVERT(Numeric(18,3), timePosition)
ELSE null
END AS ViewTime
FROM
TableAssetTracking tt
inner join TableAssets ta
on tt.AssetID = ta.AssetID
WHERE
tt.timePosition is not null
AND
AssetBuffering is null
任何建议将不胜感激。谢谢,德里克
我需要解决的问题是按资产ID,客户ID和状态选择记录。
我需要选择状态为“完成”的记录(如果存在)。
select distinct assetID, CustomerID
from table
where status = 'complete'
如果一条记录的状态为“正在播放”,但不存在具有相同资产标识和客户标识的状态为“完成”的记录,则选择该记录。
select assetID, CustomerID
from table
where status = 'playing'
except
select assetID, CustomerID
from table
where status = 'complete'
如果一条记录的状态为“开始”,但是不存在具有相同资产标识和客户标识的状态为“完成”或“正在播放”的记录,则选择该记录。
select assetID, CustomerID
from table
where status = 'start'
except
select assetID, CustomerID
from table
where status in ('complete', 'playing')
上面的内容不会为您提供我在示例中看到的ViewTime,
它不在需求声明中
select *
from
( select assetID, CustomerID, status, ViewTime
, row_number() over (partition by assetID, CustomerID order by status, ViewTime desc) as rn
from table
where status in ('complete', 'playing', 'start')
) tt
where tt.rn = 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句