এই দুটি প্রশ্নের অনুমানের উপর নির্ভর করে যা Taco_value
সময়ের সাথে সর্বদা বৃদ্ধি পায়।
;WITH x AS
(
SELECT Taco_ID, Taco_date,
dr = ROW_NUMBER() OVER (PARTITION BY Taco_ID, Taco_Value ORDER BY Taco_date),
qr = ROW_NUMBER() OVER (PARTITION BY Taco_ID ORDER BY Taco_date)
FROM dbo.Taco
), y AS
(
SELECT Taco_ID, Taco_date,
rn = ROW_NUMBER() OVER (PARTITION BY Taco_ID, dr ORDER BY qr DESC)
FROM x WHERE dr = 1
)
SELECT Taco_ID, Taco_date
FROM y
WHERE rn = 1;
কম উইন্ডো ফাংশন পাগলামি সহ একটি বিকল্প:
;WITH x AS
(
SELECT Taco_ID, Taco_value, Taco_date = MIN(Taco_date)
FROM dbo.Taco
GROUP BY Taco_ID, Taco_value
), y AS
(
SELECT Taco_ID, Taco_date,
rn = ROW_NUMBER() OVER (PARTITION BY Taco_ID ORDER BY Taco_date DESC)
FROM x
)
SELECT Taco_ID, Taco_date FROM y WHERE rn = 1;
এসকিউএলফিডেলে উদাহরণ
হালনাগাদ
যারা ট্র্যাক রাখছেন তাদের পক্ষে বিতর্ক ছিল যে যদি Taco_value
কখনও পুনরাবৃত্তি করা যায় তবে কী হয় । এটি যদি 1 থেকে 2 এবং পরে প্রদত্ত যে কোনওটির জন্য 1 এ ফিরে যেতে পারে Taco_ID
তবে কোয়েরিগুলি কাজ করবে না। এই মামলার সমাধান এখানে রয়েছে, যদিও এটি ফাঁক এবং দ্বীপপুঞ্জের কৌশলটি না হলেও এটিজিক বেন-গানের মতো কেউ স্বপ্ন দেখতে সক্ষম হতে পারে, এবং এটি অপির দৃশ্যের সাথে প্রাসঙ্গিক না হলেও - এটি হতে পারে ভবিষ্যতের পাঠকের সাথে প্রাসঙ্গিক। এটি কিছুটা জটিল, এবং আমি একটি অতিরিক্ত ভেরিয়েবলও যুক্ত করেছিলাম - Taco_ID
যা কেবল কখনও একটি রয়েছে Taco_value
।
আপনি যদি এমন কোনও আইডির জন্য প্রথম সারিটি অন্তর্ভুক্ত করতে চান যেখানে পুরো সেটটিতে কোনও মানই বদলায় না:
;WITH x AS
(
SELECT *, rn = ROW_NUMBER() OVER
(PARTITION BY Taco_ID ORDER BY Taco_date DESC)
FROM dbo.Taco
), rest AS (SELECT * FROM x WHERE rn > 1)
SELECT
main.Taco_ID,
Taco_date = MIN(CASE
WHEN main.Taco_value = rest.Taco_value
THEN rest.Taco_date ELSE main.Taco_date
END)
FROM x AS main LEFT OUTER JOIN rest
ON main.Taco_ID = rest.Taco_ID AND rest.rn > 1
WHERE main.rn = 1
AND NOT EXISTS
(
SELECT 1 FROM rest AS rest2
WHERE Taco_ID = rest.Taco_ID
AND rn < rest.rn
AND Taco_value <> rest.Taco_value
)
GROUP BY main.Taco_ID;
আপনি যদি এই সারিগুলি বাদ দিতে চান তবে এটি কিছুটা জটিল, তবে এখনও সামান্য পরিবর্তনগুলি:
;WITH x AS
(
SELECT *, rn = ROW_NUMBER() OVER
(PARTITION BY Taco_ID ORDER BY Taco_date DESC)
FROM dbo.Taco
), rest AS (SELECT * FROM x WHERE rn > 1)
SELECT
main.Taco_ID,
Taco_date = MIN(
CASE
WHEN main.Taco_value = rest.Taco_value
THEN rest.Taco_date ELSE main.Taco_date
END)
FROM x AS main INNER JOIN rest -- ***** change this to INNER JOIN *****
ON main.Taco_ID = rest.Taco_ID AND rest.rn > 1
WHERE main.rn = 1
AND NOT EXISTS
(
SELECT 1 FROM rest AS rest2
WHERE Taco_ID = rest.Taco_ID
AND rn < rest.rn
AND Taco_value <> rest.Taco_value
)
AND EXISTS -- ***** add this EXISTS clause *****
(
SELECT 1 FROM rest AS rest2
WHERE Taco_ID = rest.Taco_ID
AND Taco_value <> rest.Taco_value
)
GROUP BY main.Taco_ID;
আপডেট করা এসকিউএলফিডাল উদাহরণ
taco
খাবারের সাথে কিছু করার নেই?