2017-08-04 8 views
0

私はSQLの初心者です。正確な質問をする前にシナリオを簡潔に説明し、適切な文脈を描いてみたい。T-SQLを使用して大量のデータをフィルタリングし、結果のグループを処理する方法は?

私は電子トークンが作成、更新、または閉鎖されるたびにレコードを含む大きなテーブルを持っています。テーブルの主キーは "HistoryID"であり、各トークンにはその日の開始時にリサイクルされるTokenNoがあります(つまり、トークン番号が15の単一のトークン、例えば15は同じ中に開けたり、閉じたり、再び開くことができません日)。

以下は、表のスナップショットです。表示されているように、Token No 940が作成され(ステータスID = 1)、さまざまなステータス(2,3,4)に更新されてから閉じられます(10)。後日、940のレコードが続きます。

╔═════════════════╦══════════╦═══════════╦═════════════════════════╗ 
║ History ID (PK) ║ Token ID ║ Status ID ║ Status Updated On ║ 
╠═════════════════╬══════════╬═══════════╬═════════════════════════╣ 
║   13435 ║  953 ║   1 ║ 2013-01-24 16:20:26.957 ║ 
║   13436 ║  940 ║   1 ║ 2013-01-24 16:20:22.090 ║ 
║   13437 ║  939 ║   3 ║ 2013-01-24 16:20:30.290 ║ 
║   13438 ║  939 ║   5 ║ 2013-01-24 16:21:07.387 ║ 
║   13439 ║  940 ║   2 ║ 2013-01-24 16:21:09.000 ║ 
║   13440 ║  940 ║   3 ║ 2013-01-24 16:23:14.510 ║ 
║   13441 ║  940 ║   4 ║ 2013-01-24 16:23:15.860 ║ 
║   13442 ║  940 ║  10 ║ 2013-01-24 16:23:30.013 ║ 
║   13443 ║  938 ║   2 ║ 2013-01-24 16:23:31.657 ║ 
╚═════════════════╩══════════╩═══════════╩═════════════════════════╝ 

関連付けられているトークンでレコードをグループ化する必要があります。私が見ていることは、まずレコードを1日ごとにフィルタリングする必要があることを意味し、トークン番号で結果をフィルタリングし、各トークン番号と1日あたりのレコードのグループを与えます。ある状態から別の状態に変更するのにかかる時間を平均化する、トークンが開いている期間をグラフ化するなど、必要な計算を実行できます。

私はこれをどうやって行うのかわかりません。どんな助けでも大歓迎です。経験豊富なSQL開発者にとって、このような問題はかなり簡単だと思いますか?事前に

感謝:)

+0

あなただけの 'SELECT COUNT(HistoryID)が必要です.. 。履歴からGROUP BY TokenID、CAST(StatusUpdatedOn DATE) '...?私はあなたが少なくともあなたの望む結果を加えなければならないと思います。 –

+0

私は、初心者から中級者向けのSQLチュートリアルとして、www.sqlzoo.netをお勧めします。運が良かった。 – JeffUK

+0

LEAD()分析関数は、状態変化の時間差を計算するのに便利です。これは、あなたがavgに必要な時間を与え、オープン時間などを決定します。日付のMin()/ max()は、各トークンのオープン時間とクローズ時間を与えます(より早いと仮定し、分析関数とケースステートメントを使用してそれを把握することができますが、実際には具体的な質問はありません。期待される結果をいくつか提供してください。 – xQbert

答えて

0

ただ、今日と言う日のためにトークンを選択するために、単純なCTEまたは共通テーブル式を使用して、あなたはそのCTE

with temp as 
    (
    select token id ,count(1) as cnt 
    from table 
    where status date = getdate() 
    group by token id 
    ) 
<do the operations here > 

に基づいて操作を行うことができます表が非常に巨大である場合CTEは少しその場合slower.In

 select token id ,count(1) as cnt 
    into #temp 
    from table 
    where status date = getdate() 
    group by token id 
0
WITH CTE1 
AS 
(SELECT History ID, MAX(Token ID), MAX(Status ID), Status Updated On 
FROM Table 
GROUP BY History ID, Status Updated On) 
/* Status Updated On looks like a DateTime, so if you're grouping by date 
you'll want to do CONVERT(DATE, Status Updated On) in the GROUP BY */ 

SELECT * FROM CTE1 
/* Choose the calculations, aggregations or arithmetic operations you need 
to do here with CTE1. Important note, you are now selecting from 
CTE1.Column*/ 
以下のようにテーブルにフィルタリングされた結果を置くかもしれません

これは役に立ちましたか?

編集:私はあなたの質問を再読し、あなたの代わりに履歴IDのトークンIDによって、グループにしようとしているようだ(と思う?)

WITH CTE1 
AS 
(SELECT MAX(History ID), Token ID, MAX(Status ID), Status Updated On 
FROM Table 
GROUP BY Token ID, Status Updated On) 

SELECT * FROM CTE1 
関連する問題