如何有条件地从SQL Server选择记录

德里克·肯尼

朋友们,

我有一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章