একই কলামের মধ্যে তারিখের যোগফলের সমষ্টি


10

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

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

পোস্টগ্র্যাস্কল 9.x এ কাজ করা ...

সারণীতে ডেটা উদাহরণ;

eventtype, eventdate
START, 2015-01-01 14:00
END, 2015-01-01 14:25
START, 2015-01-01 14:30
END, 2015-01-01 14:43
START, 2015-01-01 14:45
END, 2015-01-01 14:49
START, 2015-01-01 14:52
END, 2015-01-01 14:55

দ্রষ্টব্য, সমস্ত সূচনা এবং শেষ তারিখগুলি ক্রমিক হবে।

এই আমার প্রথম প্রচেষ্টা। কাজ করছে বলে মনে হচ্ছে।

SELECT 
-- starts.*
SUM(EXTRACT(EPOCH FROM (eventdate_next - eventdate))) AS duration_seconds
FROM
( 
    WITH x AS (
        SELECT *, dense_rank() OVER (ORDER BY eventdate) AS rnk
        FROM   table
        AND eventdate > '2015-01-01 00:00:00.00'
        AND eventdate < '2016-01-01 23:59:59.59' 
        )
    SELECT x.eventdate, x.eventtype, y.eventdate AS eventdate_next,  y.eventtype AS eventtype_next
    FROM   x
    LEFT   JOIN (SELECT DISTINCT eventdate, eventtype, rnk FROM x) y ON y.rnk = (x.rnk + 1)
    ORDER  BY x.eventdate
) starts
WHERE
eventtype = 'START'   
GROUP BY eventtype 

আমার প্রথম প্রয়াস স্ট্যাকওভারফ্লো পোস্টগ্রেস 9.1 - পরবর্তী মান পাওয়া থেকে দুর্দান্ত উদাহরণের উপর ভিত্তি করে

বিঃদ্রঃ; আপনি গ্রুপ এবং এসইএম-এর মাধ্যমে মন্তব্য করতে পারেন এবং শুরুতে আন-মন্তব্য করতে পারেন *

উত্তর:


10

আপনি LEADপরবর্তী সারিটির জন্য eventtypeএবং eventdateবর্তমান সারির ডেটার পাশাপাশি বিশ্লেষণমূলক ফাংশনটি ব্যবহার করতে পারেন :

SELECT
  eventtype,
  eventdate,
  LEAD(eventtype) OVER (ORDER BY eventdate) AS nexttype,
  LEAD(eventdate) OVER (ORDER BY eventdate) AS nextdate
FROM
  atable
WHERE
      eventdate >= '2015-01-01 00:00:00.00'
  AND eventdate <  '2016-01-01 23:59:59.59'

উত্সযুক্ত টেবিল হিসাবে উপরের ক্যোয়ারীটি ব্যবহার করে আপনি আউটপুট আরও ফিল্টার করতে পারবেন eventtype = 'START' AND nexttype = 'END'এবং মোট পার্থক্যটি পেতে পারেন:

SELECT
  SUM(EXTRACT(EPOCH FROM (nextdate - eventdate))) AS duration_seconds
FROM
  (
    SELECT
      eventtype,
      eventdate,
      LEAD(eventtype) OVER (ORDER BY eventdate) AS nexttype,
      LEAD(eventdate) OVER (ORDER BY eventdate) AS nextdate
    FROM
      atable
    WHERE
          eventdate >= '2015-01-01 00:00:00.00'
      AND eventdate <  '2016-01-01 23:59:59.59'
  ) AS s
WHERE
      eventtype = 'START'
  AND nexttype  = 'END'
;

সামান্য প্রকরণ হিসাবে, আপনি একটি সাবউইটি সিটিই হিসাবে প্রয়োগ করতে পারেন:

WITH cte AS
  (
    SELECT
      eventtype,
      eventdate,
      LEAD(eventtype) OVER (ORDER BY eventdate) AS nexttype,
      LEAD(eventdate) OVER (ORDER BY eventdate) AS nextdate
    FROM
      atable
    WHERE
          eventdate >= '2015-01-01 00:00:00.00'
      AND eventdate <  '2016-01-01 23:59:59.59'
  )
SELECT
  SUM(EXTRACT(EPOCH FROM (nextdate - eventdate))) AS duration_seconds
FROM
  cte
WHERE
      eventtype = 'START'
  AND nexttype  = 'END'
;

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


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