SQL Server 2012では、複数のチェックインが行われている間、1つのアイテムを1つの連続した期間にわたって1人の行を返すにはどうすればよいですか?アイテムと日付のチェックインとチェックアウト
我々は3つのテーブルがあります。人は、彼らが項目にチェックインをする時はいつでも関係表が更新された人、
Id, Fullname
関係
PersonId, ItemId, DateTime
項目
Id, ItemName
を手元にある。
私はすべての結果を取得するために3つのテーブルを結合することができますが、私は後だが、以下の結果である:
フルネーム、アイテム、チェックイン、チェックアウト 例えば
Person1, Item1, 2016-10-25 20:00:00.000, 2016-10-29 20:00:00.000
Person1, Item2, 2016-10-25 20:00:00.000, 2016-10-26 20:00:00.000
Person1, Item2, 2016-10-28 20:00:00.000, 2016-10-29 20:00:00.000
Person1, Item3, 2016-10-25 20:00:00.000, 2016-10-29 20:00:00.000
...
...
注「PERSON1は」 'Person1'が 'Item2'なしで27日目にチェックインを行ったため、 'Person1'、 'Item2'の2つのエントリがあるため '2016-10-27 20:00:00.000'の 'Item2' '
テーブルを作成するためのtSQLコードは次のとおりです。
IF OBJECT_ID('tempdb.dbo.#Person', 'U') IS NOT NULL DROP TABLE tempdb.dbo.#Person
IF OBJECT_ID('tempdb.dbo.#Relationship', 'U') IS NOT NULL DROP TABLE tempdb.dbo.#Relationship
IF OBJECT_ID('tempdb.dbo.#Item', 'U') IS NOT NULL DROP TABLE tempdb.dbo.#Item
CREATE TABLE #Person(
Id int IDENTITY,
Fullname nvarchar(100)
);
CREATE TABLE #Relationship(
Id int IDENTITY,
PersonId int,
ItemId int,
DateTime datetime
);
CREATE TABLE #Item(
Id int IDENTITY,
ItemName nvarchar(100)
);
INSERT INTO #Person (Fullname)
VALUES ('Person1'),
('Person2'),
('Person3');
INSERT INTO #Item (ItemName) VALUES
('Item1'),
('Item2'),
('Item3');
INSERT INTO #Relationship (PersonId, ItemId, DateTime) VALUES
(1, 1, '2016-10-25 20:00:00.000'),
(1, 2, '2016-10-25 20:00:00.000'),
(1, 3, '2016-10-25 20:00:00.000'),
(1, 1, '2016-10-26 20:00:00.000'),
(1, 2, '2016-10-26 20:00:00.000'),
(1, 3, '2016-10-26 20:00:00.000'),
(1, 1, '2016-10-27 20:00:00.000'),
(1, 3, '2016-10-27 20:00:00.000'),
(1, 1, '2016-10-28 20:00:00.000'),
(1, 2, '2016-10-28 20:00:00.000'),
(1, 3, '2016-10-28 20:00:00.000'),
(1, 1, '2016-10-29 20:00:00.000'),
(1, 2, '2016-10-29 20:00:00.000'),
(1, 3, '2016-10-29 20:00:00.000'),
(2, 1, '2016-10-25 20:00:00.000'),
(2, 2, '2016-10-25 20:00:00.000'),
(2, 3, '2016-10-25 20:00:00.000'),
(2, 1, '2016-10-26 20:00:00.000'),
(2, 2, '2016-10-26 20:00:00.000'),
(2, 3, '2016-10-26 20:00:00.000'),
(2, 1, '2016-10-27 20:00:00.000'),
(2, 2, '2016-10-27 20:00:00.000'),
(2, 3, '2016-10-27 20:00:00.000');
SELECT P.FullName, I.ItemName, R.DateTime As CheckInDate FROM #Person AS P
INNER JOIN #Relationship AS R ON R.PersonId = P.Id
INNER JOIN #Item AS I ON I.Id = R.ItemId
解決策を見つけるお手伝いをしてくれてありがとう!
編集:すべての結果を返して、C#でRBARを処理できましたが、私は洗練されたSQLソリューションを望んでいました。あなたの考えは?
を逃すことができるのであれば、あなたが 'GROUP BY'のフルネームとitemNameにしたいと' MIN'と 'MAX'日付を取得合うようにJOINS調整する必要があるかもしれませんか? – ZLK
私は両方を使ってプレイしました MIN(R.DateTime)OVER()AS CheckInDate、MAX(R.DateTime)OVER()AS CheckOutDate' チェックイン時に行を分割することができませんでした特定の項目なしで発生しました。 – bsand
'LEAD'と' LAG'関数はあなたのセットの前/次の値を得ることを可能にします。代わりに 'ROW_NUMBER'を使ってこれを解決できます。 – mheptinstall