সময়ের ব্যবধানের উপর ভিত্তি করে রেকর্ড গোষ্ঠীকরণ


12

আমার কাছে নিম্নলিখিত স্কিমা সহ একটি টেবিল রয়েছে এবং আমার একটি ক্যোয়ারী সংজ্ঞায়িত করতে হবে যা সময়ের ব্যবধানের ভিত্তিতে ডেটা গ্রুপ করতে পারে ( প্রতি মিনিটে রেকর্ড ) এবং তারপরে পূর্ববর্তী গ্রুপ থেকে স্ন্যাপশটভ্যালুতে পরিবর্তনের যোগফল সরবরাহ করতে পারে। বর্তমানে স্ন্যাপশটভ্যালু সর্বদা বৃদ্ধি পায় তাই আমার কেবলমাত্র পার্থক্যের যোগফল প্রয়োজন। যে কেউ এসকিউএল সার্ভার টি-এসকিউএল কোয়েরিতে সহায়তা করতে পারে যা এটি করতে পারে? আমি স্কিমা পরিবর্তন করার জন্য উন্মুক্ত, তবে আমার কাছে বর্তমানে এটি রয়েছে।

স্কিমা

CaptureTime   (datetime)
SnapShotValue (int)

নমুনা তথ্য

1 Jan 2012 00:00:00,   100
1 Jan 2012 00:00:30,   125
1 Jan 2012 00:01:00,   200
1 Jan 2012 00:01:30,   300
1 Jan 2012 00:02:15,   400
1 Jan 2012 00:02:30,   425
1 Jan 2012 00:02:59,   500

কাঙ্ক্ষিত প্রশ্নের ফলাফল Res

1 Jan 2012 00:01:00,   225 -- Sum of all captured data changes up to the 1 minute mark
1 Jan 2012 00:02:00,   500 -- Sum of all captured data changes up to the 2 minute mark
1 Jan 2012 00:03:00,   125 -- Sum of all captured data changes up to the 3 minute mark

উত্তর:


17
select dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0),
       sum(SnapShotValue)
from YourTable
group by dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)

দঃপূঃ-ডেটা

datediff(minute, 0, CaptureTime)আপনি যেহেতু মিনিট সংখ্যা দেয় 1900-01-01T00:00:00

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)যেহেতু মিনিট যোগ করা 1900-01-01T00:00:00থেকে 1900-01-01T00:00:00শুধুমাত্র মিনিট সঙ্গে একটি DATETIME সঙ্গে শেষ পর্যন্ত।

1+নেই কারণ আপনার পরবর্তী মিনিট চেয়েছিলেন।

5 মিনিটের ব্যবধানে এটি করার জন্য আপনাকে কিছু গণনা করতে হবে। এর সাথে মিনিটগুলি বিভক্ত করুন 5এবং এর সাথে গুণিত করুন 5আপনাকে মিনিটের 5 মিনিটের নির্ভুলতায় গোল করে দেয়। এটি কাজ করে কারণ এসকিউএল সার্ভারে পূর্ণসংখ্যা বিভাগের ফলাফল একটি পূর্ণসংখ্যা।

dateadd(minute, 5 + (datediff(minute, 0, CaptureTime) / 5) * 5, 0)

এটি উত্তরের জন্য একটি দুর্দান্ত কাঠামো সরবরাহ করেছিল, তবে কীভাবে এটি কাজ করে তা বুঝতে আমার এখনও কিছুটা সমস্যা হচ্ছে। আমি যখন অফসেটটি 1 মিনিটের ব্যবধান থেকে 5 মিনিটের ব্যবধানে পরিবর্তন করার চেষ্টা করি তখনও পুরো ফলাফলটি ভিন্ন প্রারম্ভিক বিন্দুতে শুরু করে আমি 1 মিনিটের ব্যবধান পাই। এটি খুব সম্ভবত কারণ আমি কীভাবে এটি কাজ করে তা ভুল বুঝে চলেছি। আপনি কি আরও 1 মিনিট অন্তর অন্তর অন্তর প্রদর্শিত আরও একটি নমুনা সরবরাহ করতে পারেন? ধন্যবাদ ...
জোজিকি

0

আমি সেখানে তৃতীয় উদাহরণ দিয়ে কিছুটা বিভ্রান্ত করছি, এটি কি 1325 বলে মনে করা হচ্ছে? স্ন্যাপশটভ্যালুগুলির সমষ্টি ক্যাপচার করার প্রয়োজনীয়তার ভিত্তিতে, নীচের ক্যোয়ারীটি আপনার পরে যা পাওয়া উচিত তা পাওয়া উচিত।

select dateadd(minute,1,convert(varchar(20),capturetime)), sum(snapshotvalue)
from snapshotdata sd
group by dateadd(minute,1,convert(varchar(20),capturetime))

0

নিম্নলিখিতটি পোস্টগ্রেএসকিউএল-এ গৃহীত উত্তরের অনুবাদ (আমি জানুয়ারী 1 লা 2000, বেস তারিখ হিসাবে বেছে নিয়েছি your আপনার ডেটা এর চেয়ে পুরানো হলে এটি আগের তারিখে পরিবর্তন করুন):

SELECT 
  TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
  , SUM(SnapShotValue)
FROM table_name
GROUP BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
ORDER BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.