2016-06-24 11 views
1

フレンド、条件付きでSQL Serverからレコードを選択する方法

私はヘルプを使うことができるSQLの問題があります。 SQL Server 2008で作業しています。

使用例は次のとおりです。私たちには、ユーザーがビデオを見るシステムがあり、ユーザーがビデオを見るたびに、そのアクティビティを記録します。私たちは毎回3つのプロパティを取得します。 assetid(アセットは動画)、customerid、およびstatusです。

レコードには3つの異なるステータスがあります。 '完了'、 '再生'、 '開始'の3つの項目があります。

システムのこの部分を書いた人は開発者ではなく、既存のレコードのステータスを更新する代わりに、ユーザーがビデオを見るたびに新しい重複レコードを挿入します。したがって、何千もの重複レコードがあります。ここではサンプルデータセット

enter image description here

私は解決する必要がある問題がassetid、得意先、および状況によってレコードを選択することです。 「完了」のステータスを持つレコードを選択する必要があります。

レコードが '再生'のステータスを持ち、 '完了'のステータスを持つ同じassetidおよびcustomeridを持つレコードが存在しない場合は、そのレコードを選択します。

レコードのステータスが「開始」で、ステータスが「完了」または「再生中」の同じassetidおよびcustomeridのレコードが存在しない場合は、そのレコードを選択します。

ここでは、問題を解決するために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 

ご意見をいただければ幸いです。ありがとう、Derek

+2

サンプルデータの代わりに、いくつかのddlと消耗品データはどうですか?出力として期待していることの説明もかなり役立ちます。あなたはこの記事を検討するかもしれません。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

また、この質問はdba.stackexchange.comの方が適しているかもしれません。 – John

+0

@ジョンDBAは、彼らはちょうどこの基本SQLを検討し、SEに滞在する – Paparazzi

答えて

1

私が解決しなければならない問題は、assetid、customerid、statusでレコードを選択することです。

ステータスが「完了」のレコードを選択する必要があります。

select distinct assetID, CustomerID 
    from table 
where status = 'complete' 

レコードは「演奏」のステータスを持っていますが、「完了」の状態と同じassetidと得意先とのレコードが存在しない場合、そのレコードを選択した場合。

select assetID, CustomerID 
    from table 
where status = 'playing' 
except 
select assetID, CustomerID 
    from table 
where status = 'complete' 

レコードは「スタート」のステータスを持っていませんが、「完了」または存在「演奏」のいずれかの状態に同じassetidや得意先とは、レコードは、そのレコードを選択した場合。上記

select assetID, CustomerID 
    from table 
where status = 'start' 
except 
select assetID, CustomerID 
    from table 
where status in ('complete', 'playing') 

あなたは、私はそれがこれを行うには、多くの方法があります

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 
+0

この回答に欠けていることを分かち合いたいですか? – Paparazzi

1

要件文ではなかった例
で見ることViewTime与えるつもりはありません。ここに1つあります。

サンプルコードのテーブルが質問の説明と一致しないため、psuedocodeを使用します。このテクニックをテーブルに適用する必要があります。

SELECT DISTINCT t.AssetId, t.CustomerId, (
    SELECT TOP 1 Status 
    FROM MyTable t1 
    WHERE t1.AssetId=t.AssetId 
    AND t1.CustomerId=t.CustomerId 
    ORDER BY CASE t1.Status 
    WHEN 'Completion' THEN 0 
    WHEN 'Playing' THEN 1 
    WHEN 'Started' THEN 2 
    ELSE 3 
    END ASC 
) AS Status 
FROM MyTable t 
+0

あなたは最高です。すべてのソリューションは素晴らしいものでした。私はパパラッチによって提案された解決策を使用し、私の問題を解決しました。みんなに感謝します。 –

+0

Tab、あなたの解決策を明確にしてもらえますか?私はそれを完全に理解したい。私はORDER BY CASEを手に入れます。私が不明な点は、WHERE文を使ったサブクエリです。あなたはMyTable t1の必要性と、t1.AssetId = t.AssetIdのWHERE文について説明できますか?どうもありがとう。 –

+0

WHEREステートメントは、サブクエリをメインクエリに関連付けるために必要です。メインクエリの現在の行のステータスのみを確認してください。 –

1

私はこれを使用して、データを幅広く見る方法を示しました。それぞれの人物とビデオのためにテーブルに挿入された最後のレコードを本当に特定したいと思う。そこで、最後のレコードを取得して、そのレコードのステータスを取得します。

IF OBJECT_ID('tempdb..#lastRecord') IS NOT NULL DROP TABLE #lastRecord 

    SELECT 
     max(trackingassetdatecreated) dt, 
     assetid, 
     customerid, 
    INTO #lastRecord 
    FROM 
     TableAssetTracking 
    GROUP BY 
     assetid, 
     customerid 

    SELECT 
     t.assetstatus, 
     lr.* 
    FROM 
     TableAssetTracking t 
    INNER JOIN 
     #lastRecord lr on 
      lr.trackingassetdatecreated = t.trackingassetdatecreated 
      and lr.assetid = t.assetid 
      and lr.customerid = t.customerid 
関連する問題