2017-03-09 16 views
0

From_IDとTo_IDの2つの行があるテーブルがあります。私は、同じWork_IDを持つことに基づいてグループ化された行を必要とし、グループ化はFrom_IDから開始し、そのTo_IDをとり、その行のTo_IDとしてFrom_IDを有する行を探すべきである。これらは連続していることはできません。 To_IDとしてFrom_IDを持つ行がない場合にのみ、グループを終了する必要があります。私はテーブル定義とスクリーンショットが私のクエリをクリアすると思う。2列の連続した行をグループ化する

CREATE TABLE [dbo].[tblttt](
[ID] [bigint] IDENTITY(1,1) NOT NULL, 
[Work_ID] [nvarchar](max) NULL, 
[From_ID] [int] NULL, 
[To_ID] [int] NULL, 
[Share] [float] NULL, 
CONSTRAINT [PK_tblttt] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)) 
GO 
SET IDENTITY_INSERT [dbo].[tblttt] ON 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (1, N'051111Clus', 30500004, 30500005, 0.025) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (2, N'051111Clus', 30500004, 30500007, 0.025) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (3, N'051111Clus', 30500004, 30500009, 0.25) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (4, N'051111Clus', 30500004, 30500027, 0.025) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (5, N'051111Clus', 30500004, 30500029, 0.45) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (6, N'051111Clus', 30500005, 30500006, 1) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (7, N'051111Clus', 30500007, 30500008, 1) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (8, N'051111Clus', 30500009, 30500010, 0.6) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (9, N'051111Clus', 30500009, 30500024, 0.4) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (10, N'051111Clus', 30500010, 30500011, 0.33333333333333331) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (11, N'051111Clus', 30500010, 30500017, 0.666666666666667) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (12, N'051111Clus', 30500011, 30500012, 1) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (13, N'051111Clus', 30500012, 30601745, 1) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (14, N'051111Clus', 30500013, 30500014, 1) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (15, N'051111Clus', 30500015, 30500016, 1) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (16, N'051111Clus', 30500017, 30601746, 1) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (17, N'051111Clus', 30500018, 30500019, 0.66666666666666663) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (18, N'051111Clus', 30500021, 30500022, 1) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (19, N'051111Clus', 30500022, 30500023, 1) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (20, N'051111Clus', 30500024, 30500025, 1) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (21, N'051111Clus', 30500025, 30500026, 0.5) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (22, N'051111Clus', 30500027, 30601747, 1) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (23, N'051111Clus', 30500029, 30500030, 0.5) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (24, N'051111Clus', 30601745, 30500013, 0.5) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (25, N'051111Clus', 30601745, 30500015, 0.5) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (26, N'051111Clus', 30601746, 30500018, 0.75) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (27, N'051111Clus', 30601746, 30500021, 0.25) 
GO 
INSERT [dbo].[tblttt] ([ID], [Work_ID], [From_ID], [To_ID], [Share]) VALUES (28, N'051111Clus', 30601747, 30500028, 1) 
GO 
SET IDENTITY_INSERT [dbo].[tblttt] OFF 
GO 

出力は以下です:スクリーンショットから明らかなように

Table

、最初のグループは、株式の値がこのような1であるべきである30500005.として30500004とTo_IDとしてFrom_ID有するなされるであろうこのグループの最初の行。このグループの次のエントリは、From_IDが30500005、To_IDが30500006の行で、その行の1と同じものを共有します。 30500006としてFrom_IDとは行がないので今、このグループは終わるだろうと新しいグループが再び30500007.

として30500004としてFrom_IDとTo_IDを持ち始めるでしょう私が試した次が、そのどこにも私の要件:

SELECT 
TR.* 
FROM tbltttT 
LEFT JOIN tblttt TR 
ON T.From_ID = TR.To_ID 
WHERE T.work_id = '051111Clus' AND TR.work_id = '051111Clus' 

これをどのように達成できますか?

+0

期待する出力を表示できますか? – SqlZim

+0

再帰的なCTEをhttps://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspxで読んでみてください。これはあなたの後のことですか? – Skippy

+0

@SqlZim新しい列を持つ出力をスクリーンショット[grp](http://imgur.com/KaFxpeM)に入れたいです。スクリーンショットから見ると、同じTo_IDとFrom_IDを持つ行を同じグループに入れて、前の行のTo_IDと同じFrom_IDの行が見つからない場合は停止します。その後、グループ番号を増やします。 –

答えて

0

私はループの代わりに、再帰的なことで、これを解決クエリは、すべてのリーフノードから開始してから、親ノードまで、最上位ノードまでです。

0

私はCTEに従ってみましたが、必要なBranchNumberを私に与えてくれません。

;WITH EXPL (Work_ID, From_ID, To_ID, Share) 
AS 

(SELECT 
    t.Work_ID 
    ,t.From_ID 
    ,t.To_ID 
    ,t.Share 
FROM tblttt t 

WHERE t.From_ID = '30500004' 

UNION ALL 

SELECT 
    CHILD.Work_ID 
    ,CHILD.From_ID 
    ,CHILD.To_ID 
    ,CHILD.Share 

FROM EXPL PARENT 
     ,tblttt CHILD 

WHERE PARENT.To_ID = CHILD.From_ID) 

SELECT DISTINCT 
Work_ID, From_ID, To_ID, Share 

FROM EXPL 

ORDER BY From_ID, To_ID; 

しかし、私は(あまりにもBranchNumで)このような出力をしたい、テーブルとして変更は何も同じ出力を与えることはありません:

enter image description here

関連する問題