সমস্ত শিশুদের জন্য মোট সন্ধান করতে পুনরাবৃত্তির সিটিই


16

এখানে একটি অ্যাসেমব্লী ট্রি রয়েছে যা আমি পুনরাবৃত্ত T-SQLঅনুসন্ধান (সম্ভবতঃ) ব্যবহার করে অনুসন্ধান করতে চাইCTE নীচে প্রত্যাশিত ফলাফলগুলির সাথে ) । আমি কোনও অংশ প্রদত্ত সমাবেশের মোট পরিমাণ জানতে চাই।

অর্থ যদি আমি 'রিভেট' অনুসন্ধান করি তবে আমি সরাসরি বাচ্চাদের গণনা নয়, সমাবেশের মধ্যে প্রতিটি স্তরে মোট গণনা জানতে চাই।

Assembly (id:1)
    |
    |-Rivet
    |-Rivet
    |-SubAssembly (id:2)
    |   |
    |   |-Rivet
    |   |-Bolt
    |   |-Bolt
    |   |-SubSubAssembly (id:3)
    |      |
    |      |-Rivet
    |      |-Rivet
    |
    |-SubAssembly (id:4)
       |-Rivet
       |-Bolt

    DESIRED Results
    -------
    ID, Count
    1 , 6
    2 , 3
    3 , 2
    4 , 1

বর্তমানে, আমি সরাসরি পিতামাতাদের পেতে পারি, তবে আমার এই তথ্যটি উপরের দিকে রোল করার জন্য আমার সিটিই কীভাবে প্রসারিত করতে হবে তা জানতে চাই।

With DirectParents AS(
--initialization
Select InstanceID, ParentID
From Instances i 
Where i.Part = 'Rivet'

UNION ALL
--recursive execution
Select i.InstanceID, i.ParentID
From PartInstances i  INNER JOIN DirectParents p
on i.ParentID = p.InstanceID

)

select ParentID, Count(instanceid) as Totals
from DirectParents
group by InstanceID, ParentID

Results
-------
ID, Count
1 , 2
2 , 2
3 , 2
4 , 1

তৈরির স্ক্রিপ্ট

CREATE TABLE [dbo].[Instances] ( 
  [InstanceID] NVARCHAR (50) NOT NULL, 
  [Part] NVARCHAR (50) NOT NULL, 
  [ParentID] NVARCHAR (50) NOT NULL, );



INSERT INTO Instances 
Values 
  (1, 'Assembly', 0), 
  (50, 'Rivet', 1), 
  (50, 'Rivet', 1), 
  (2, 'SubAssembly', 1), 
  (50, 'Rivet', 2), 
  (51, 'Bolt', 2), 
  (51, 'Bolt', 2), 
  (3, 'SubSubAssembly', 2), 
  (50, 'Rivet', 3), 
  (50, 'Rivet', 3), 
  (4, 'SubAssembly2', 1), 
  (50, 'Rivet', 4), 
  (51, 'Bolt', 4)

উত্তর:


14

এই পুনরাবৃত্ত সিটিই ( এসকিউএল ফিডল ) আপনার নমুনার সাথে কাজ করা উচিত:

WITH cte(ParentID) AS(
    SELECT ParentID FROM @Instances WHERE [Part] = 'Rivet'
    UNION ALL
    SELECT i.ParentID FROM cte c
    INNER JOIN @Instances i ON c.ParentID = i.InstanceID
    WHERE i.ParentID > 0
)
SELECT ParentID, count(*) 
FROM cte
GROUP BY ParentID
ORDER BY ParentID
;

আউটপুট

ParentID    Count
1           6
2           3
3           2
4           1

দ্রষ্টব্য: আপনি মন্তব্যে উল্লেখ করেছেন যে প্রশ্নটিতে কেবল একটি সরলীকৃত নমুনা সারণী রয়েছে এবং আসল তথ্যগুলিতে যথাযথ সূচী রয়েছে এবং যথাযথভাবে নকল এবং ডেটা পরিচালনা করে।

ব্যবহৃত ডেটা ( এসকিউএল ফিডল ):

DECLARE @Instances TABLE( 
    [InstanceID] int NOT NULL
    , [Part] NVARCHAR (50) NOT NULL
    , [ParentID] int NOT NULL
);

INSERT INTO @Instances([InstanceID], [Part], [ParentID])
VALUES 
    (1, 'Assembly', 0)
    , (50, 'Rivet', 1)
    , (50, 'Rivet', 1)
    , (2, 'SubAssembly', 1)
    , (50, 'Rivet', 2)
    , (51, 'Bolt', 2)
    , (51, 'Bolt', 2)
    , (3, 'SubSubAssembly', 2)
    , (50, 'Rivet', 3)
    , (50, 'Rivet', 3)
    , (4, 'SubAssembly2', 1)
    , (50, 'Rivet', 4)
    , (51, 'Bolt', 4)
;

দুর্দান্ত উত্তর আপনাকে ধন্যবাদ! সমস্ত দৃষ্টান্ত [অ্যাসেম্বলি, রিভেট ইত্যাদি] এর জন্য পুনরাবৃত্তভাবে এটি করার সহজ সমাধান কি আছে?
গ্রিনহর্ন

0

আমি নিশ্চিত নই যে আপনি "পরিমাণ" বলতে কী বোঝেন এবং কোথায় সারণী (?) পার্টিশন এবং কলাম আইডি এবং আপনার স্যাম্পলটিতে গণনা আসে তবে আমি আপনার নমুনা ডেটা থেকে আমার গণনা করেছি।

;with ins as (
select [InstanceID], [Part],[ParentID],0 lvl
from instances where ParentID=0
union all
select i.[InstanceID], i.[Part],i.[ParentID], lvl+1
from instances i 
inner join ins on i.parentid=ins.InstanceID
)
select InstanceID,part,COUNT(*) cnt
from ins
group by instanceid,part

আমি আশা করি এটি আপনাকে কিছু ধারণা দেবে।

হালনাগাদ

আমি বুঝতে পারি যে এটি একটি পরীক্ষার উদাহরণ তবে আপনার ডেটা থেকে শুরু করে সমস্ত কিছু ভেঙে দেয় 1NF। সম্ভবত আপনার টেবিলটি দুটি ভাঙ্গা এবং স্বাভাবিক করা উচিত।


কোডের প্রথম বিভাগে ফলাফলগুলি দেখুন .. সেগুলি পছন্দসই। 'রিভেট' অনুসন্ধান করার সময়, আমি গাছের কোনও টুকরো দেওয়া মোট সমস্ত রিভেট পেতে চাইছি। উদাহরণস্বরূপ আইডিআইডি 1 আমাকে 6 এর ফলাফল দেবে Meaning এর অর্থ এটির সম্পূর্ণ গাছের কাঠামোর মধ্যে 6 টি মোট rivets রয়েছে।
মার্কোকস্টেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.