フレンド、条件付きでSQL Serverからレコードを選択する方法
私はヘルプを使うことができるSQLの問題があります。 SQL Server 2008で作業しています。
使用例は次のとおりです。私たちには、ユーザーがビデオを見るシステムがあり、ユーザーがビデオを見るたびに、そのアクティビティを記録します。私たちは毎回3つのプロパティを取得します。 assetid(アセットは動画)、customerid、およびstatusです。
レコードには3つの異なるステータスがあります。 '完了'、 '再生'、 '開始'の3つの項目があります。
システムのこの部分を書いた人は開発者ではなく、既存のレコードのステータスを更新する代わりに、ユーザーがビデオを見るたびに新しい重複レコードを挿入します。したがって、何千もの重複レコードがあります。ここではサンプルデータセット
私は解決する必要がある問題が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
サンプルデータの代わりに、いくつかのddlと消耗品データはどうですか?出力として期待していることの説明もかなり役立ちます。あなたはこの記事を検討するかもしれません。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –
また、この質問はdba.stackexchange.comの方が適しているかもしれません。 – John
@ジョンDBAは、彼らはちょうどこの基本SQLを検討し、SEに滞在する – Paparazzi