গোষ্ঠীর জন্য পূর্ববর্তী জনবহুল তারিখ থেকে ডেটা মান সহ নিখোঁজ তারিখগুলি পূরণ করুন


13

বিভাগের মধ্যে স্থানান্তরিত হয়ে যাওয়া চিত্র সহায়তা ডেস্কের টিকিট। আমরা জানতে চাই যে প্রতিদিন টিকিট খোলা রয়েছে এমন প্রতিটি দিনের জন্য প্রতিটি টিকিটের জন্য বিভাগ শেষে কী আছে। সারণীতে প্রতিটি টিকিটের জন্য সর্বশেষ বিভাগ থাকে যা এটি খোলার জন্য বিভাগে পরিবর্তন হয় (শুরুতে টিকিটটি খোলার তারিখের জন্য সারি সহ এবং এটি বন্ধ হওয়ার তারিখ সহ)। ডেটা টেবিলটি এমন দেখাচ্ছে:

CREATE TABLE TicketAssigment (
    TicketId     INT NOT NULL,
    AssignedDate DATE NOT NULL,
    DepartmentId INT NOT NULL);

আমার যা দরকার তা হ'ল প্রতিটি টিকিট আইডের জন্য কোনও অনুপস্থিত তারিখ পূরণ করা, তারিখ অনুসারে অর্ডার করা পূর্ববর্তী টিকিটঅ্যাসিগমেন্ট সারি থেকে বিভাগীয় আইডি ব্যবহার করে।

আমার কাছে যদি টিকিটঅ্যাসিগমেন্ট সারিগুলি থাকে:

1, '1/1/2016', 123 -- Opened
1, '1,4,2016', 456 -- Transferred and closed
2, '1/1/2016', 25  -- Opened
2, '1/2/2016', 52  -- Transferred
2, '1/4/2016', 25  -- Transferred and closed

আমি এই আউটপুট চাই:

1, '1/1/2016', 123
1, '1/2/2016', 123
1, '1/3/2016', 123
1, '1/4/2016', 456
2, '1/1/2016', 25
2, '1/2/2016', 52
2, '1/3/2016', 52
2, '1/4/2016', 25

দেখে মনে হচ্ছে এটি আমার যা প্রয়োজন প্রয়োজন তার কাছাকাছি হতে পারে তবে এটি শেষ করার ধৈর্য আমার ছিল না এবং আনুমানিক পরিকল্পনার ব্যয়টিতে 6 ডিজিট রয়েছে:

SELECT  l.TicketId, c.Date, MIN(l.DepartmentId)
FROM    dbo.Calendar c 
        OUTER APPLY (SELECT TOP 1 TicketId, DepartmentId FROM TicketAssigment WHERE AssignedDate <= c.Date ORDER BY AssignedDate DESC) l
WHERE   c.Date <= (SELECT MAX(AssignedDate) FROM TicketAssigment)
GROUP   BY l.TicketId, c.Date
ORDER   BY l.TicketId, c.Date;

আমি সন্দেহ করি LAG এবং একটি উইন্ডো ফ্রেম ব্যবহার করে এটি করার একটি উপায় আছে তবে আমি এটি বেশিরভাগভাবে খুঁজে পাইনি। প্রয়োজনীয়তা পূরণের আরও কার্যকর উপায় কী?

উত্তর:


14

LEAD()টিকিটআইডি পার্টিশনের মধ্যে পরবর্তী সারিটি পেতে ব্যবহার করুন । তারপরে সমস্ত তারিখের জন্য একটি ক্যালেন্ডার টেবিলটিতে যোগ দিন।

WITH TAwithnext AS
(SELECT *, LEAD(AssignmentDate) OVER (PARTITION BY TicketID ORDER BY AssignmentDate) AS NextAssignmentDate
 FROM TicketAssignment
)
SELECT t.TicketID, c.Date, t.DepartmentID
FROM dbo.Calendar c
JOIN TAwithnext t
    ON c.Date BETWEEN t.AssignmentDate AND ISNULL(DATEADD(day,-1,t.NextAssignmentDate),t.AssignmentDate)
;

ক্যালেন্ডার টেবিল পাওয়ার জন্য সমস্ত ধরণের উপায় ...


4

এটি করার একটি দ্রুত উপায় (আমি পারফরম্যান্স বা স্ক্যালাব্লটিটির জন্য পরীক্ষা করিনি)

- ক্যালেন্ডার টেবিল তৈরি করুন

-- borrowed from @Aaron's post http://sqlperformance.com/2013/01/t-sql-queries/generate-a-set-3 
CREATE TABLE dbo.Calendar(d DATE PRIMARY KEY);

INSERT dbo.Calendar(d) SELECT TOP (365)
 DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY number)-1, '20160101')
 FROM [master].dbo.spt_values
 WHERE [type] = N'P' ORDER BY number;

--- আপনার পরীক্ষার টেবিল তৈরি করুন

CREATE TABLE dbo.TicketAssigment (
    TicketId     INT NOT NULL,
    AssignedDate DATE NOT NULL,
    DepartmentId INT NOT NULL);

--  truncate table dbo.TicketAssigment;

insert into dbo.TicketAssigment values (1   ,   '1-1-2016'  ,   123 )
insert into dbo.TicketAssigment values (1   ,   '1-4-2016'  ,   456 )
insert into dbo.TicketAssigment values (2   ,   '1-1-2016'  ,   25  )
insert into dbo.TicketAssigment values (2   ,   '1-2-2016'  ,   52  )
insert into dbo.TicketAssigment values (2   ,   '1-4-2016'  ,   25  )

--- কাঙ্ক্ষিত আউটপুট পেতে প্রশ্ন

;with Cte as
(
  select TicketID, 
         min(AssignedDate) minAD, -- This is the min date
         max(AssignedDate) maxAD  -- This is the max date
  from TicketAssigment
  group by TicketID
)
select Cte.TicketID,
       c.d as AssignedDate,

       ( -- Get DeptID
       select top(1) T.departmentID
       from dbo.TicketAssigment as T
       where T.TicketID = cte.TicketID and
             T.AssignedDate <= c.d
       order by T.AssignedDate desc
       ) as DepartmentID
from Cte
  left outer join dbo.Calendar as c
      on c.d between Cte.minAD and Cte.maxAD
    order by Cte.TicketID

এখানে চিত্র বর্ণনা লিখুন


এর জন্য ধন্যবাদ! আনুমানিক বাস্তবায়ন পরিকল্পনাটি 25 বিলিয়ন সারিগুলির একটি ফলাফল সেট দেখায়, তাই আমরা প্রতিবেদনের প্রয়োজনীয়তাটি (যা বিগত বছরের প্রতিটি টিকিটের জন্য প্রতিদিন প্রতিবেদন করতে চলেছে) পুনর্বিবেচনা করতে যাচ্ছি। আমি আশা করছি প্রতিটি টিকিটের জন্য আমরা সর্বশেষ ডিপার্টমেন্টাল আইডিটি প্রদর্শন করতে এবং অনুরোধের ভিত্তিতে একটি সিলেক্ট টিকিটের জন্য দিনের বেলা ডিপার্টমেন্টাল আইডির বিশদটি প্রদর্শন করতে পারি।
মার্ক ফ্রিম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.