সাপ্তাহিক ডেটা সিরিজের মধ্যে লেনদেন নির্ধারণের জন্য অ্যালগরিদম?


9

আমি একটি ছোট প্রতিবেদন সরঞ্জাম বিকাশ করার চেষ্টা করছি (স্ক্লাইট ব্যাকএন্ড সহ)। আমি এই সরঞ্জামটিকে "লেনদেন" খাতা হিসাবে ভালভাবে বর্ণনা করতে পারি। আমি যা করার চেষ্টা করছি তা হ'ল সাপ্তাহিক ডেটা এক্সট্র্যাক্ট থেকে "লেনদেন" র ট্র্যাক রাখা:

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

আমি যা পেয়েছি তা হ'ল একটি সাপ্তাহিক ডেটা এক্সট্রাক্ট (পাইপ-বিস্মৃত ফ্ল্যাট ফাইল) একটি উত্তরাধিকার সংরক্ষণাগার / রেকর্ড-পরিচালনা সিস্টেম থেকে আসে যা আমার কোনও নিয়ন্ত্রণে নেই।

প্রতিটি লাইন মূলত এটিতে পাতন করা যায়:
resource_id | resource info | customer_id | customer_info

নমুনা তথ্য:

10| Title X       | 1 | Bob
11| Another title | 1 | Bob
10| Title X       | 2 | Alice

লক্ষ্যটি হ'ল এক্স-মাসের জন্য ব্যবহার করা হয়নি এমন সংস্থানগুলিতে রিপোর্ট করা সহজ করে (শেষ হিটের উপর ভিত্তি করে)। একটি ধারণার সময়কাল রয়েছে যেখানে যদি জনপ্রিয় হয় তবে সংস্থানগুলি সহজেই অ্যাক্সেসের জন্য রাখা হয় for এমন একটি সংস্থান যা 18 মাস ধরে ব্যবহার না করে অন্য কোথাও দীর্ঘমেয়াদী সংরক্ষণাগার জন্য চিহ্নিত করা হয়েছে।

এটি অবশ্যই একটি সাধারণ সমস্যা হবে। অবাক হচ্ছেন যদি ডেটা সেটগুলির (ডিবি বনাম সাম্প্রতিক এক্সট্র্যাক্ট) মধ্যে নতুন / একই / সরানো কী নির্ধারণ করার জন্য কোনও সাধারণ-উদ্দেশ্য অ্যালগরিদম আছে?

উত্তর:


1

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

এনপিভি = পিভি- (পিভি (সিপি / টি) বা নতুন বর্তমান মান বর্তমান সময়ের সময়ের সমান (গত প্রবেশের মাসগুলি) টার্ম দ্বারা বিভক্ত (উদাহরণস্বরূপ 18 মাস) যখন উত্সের মান 0 এর নিচে নেমে আসে তখন এটির বর্তমান মূল্য ব্যয় করা হয়।

আপনি যদি আমাকে ল্যাং দেন তবে আপনি এটি চান এটিতে আমি এখানে একটি সম্পাদনা করে কোড পোস্ট করব


ভাষা তেমন গুরুত্বপূর্ণ নয়। রুবি বা সি ++ যদি আমাকে বেছে নিতে হয়। আপনি যদি এইচটিএমএল 4.0 স্ট্রাইকটিতে একটি অ্যালগরিদম লিখতে পারেন তবে আপনি আমার নায়ক হয়ে উঠবেন। শেষ অংশটি সম্পর্কে মজা করছেন :)
স্বার্টজ

কোডটি দেখতে আগ্রহী হবে। রুবি বা সি ++। ধন্যবাদ.
সোয়ার্টজ

0

আপনি যদি কোনওভাবে এসকিউএলাইট ব্যাকএন্ডে আপডেট রাখেন তবে আপনি সাপ্তাহিক আপডেটটিকে নতুন সারণিতে পরিণত করতে এবং মার্জ করার আগে আর্কাইভ করা ডেটার সাথে কোয়েরি করে তুলনা করতে পারেন।

কোনও টেবিলটিতে নতুন সংযোজন সন্ধানের জন্য এসকিউএল ব্যবহারের উদাহরণ: /programming/2077807/sql-query-to-return-differences-between-two-tables

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


আরও ভাল, এটি একটি ডেটা কেন্দ্রিক সমাধান অন্ততপক্ষে, তবে এটি এখনও অতিমাত্রায়
জে-বস

এটি শুরু করা সহজ হওয়ায় আপাতত আমি একটি স্ক্লাইট ব্যবহার করছি। সহজেই মাইএসকিউএল (বা পোস্টগ্রেএসকিউএল) এ স্যুইচ করতে পারে। যদি কোনও নন-এসকিউএল ব্যাকএন্ড ব্যবহার করা এই কাজটিকে আরও উন্নত করতে কোনও কিছু জাল করে তোলে, আমি সব কানে আছি।
সোয়ার্টজ

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

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

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

0

বিকল্প ধারণা:

  1. আপনার লেনদেনের তালিকাকে কোনও ধরণের ডেটা কাঠামোর মধ্যে পার্স করুন, যেমন একটি অ্যারে। (সি ++ তে, ভাবেন Vectorএবং জাভাতে ArrayList

  2. আপনার এসকিউএল ব্যাকএন্ডে একটি কোয়েরি করুন যেমন SELECT DISTINCT customer_id FROM Transactions ORDER BY customer_idবাছাই করা স্বতন্ত্র গ্রাহক আইডিগুলিকে একটি সেটে প্যাক করুন old,। আপনি যদি WHEREপুরানো এবং নতুন লেনদেনকে পৃথক করে একটি ধারা দিয়ে ঠিক একই জিনিসটি করেন তবে আপনি পদক্ষেপ 3 এড়িয়ে যেতে পারেন।

  3. নতুন আপডেটগুলি থেকে স্বতন্ত্র ক্রমে পৃথক তথ্য কাঠামোতে অনন্য গ্রাহক আইডি পান। আপনি পেতে ব্যবহার করতে পারেন এমন বেশ কয়েকটি ডেটা স্ট্রাকচার রয়েছে যা একটি ডেটা স্ট্রাকচারের মধ্যে রয়েছে new। ডাবল-লিঙ্কযুক্ত তালিকায় সন্নিবেশ সাজানো খুব সহজ, তবে একটি মধ্যবর্তী হ্যাশ টেবিল ব্যবহার করে রৈখিক সময়ের কাছাকাছি চলতে পারে, বা যদি আপনি যেভাবেই মূল অ্যারে বাছাই করেন তবে এর একটি সেট বের করা সহজ।

  4. আপনার পছন্দের ভাষার স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে new- সেট পার্থক্যটি নিন old। আপনার পছন্দসই ভাষার মানক লাইব্রেরিতে এই অ্যালগরিদম আছে?

আপনার লেনদেনের ডেটাবেস আপডেট করার পরে আপনি যে অন্যান্য কাজ করতে চান তা হ'ল এসকিউএল কোয়েরি।

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


1
আমি গ্রাহকদের চেয়ে নতুন / একই / আপডেট হওয়া সংস্থানগুলিতে বেশি আগ্রহী । তবে হ্যাঁ, ধারণাটি একই হবে।
সোয়ার্টজ

0

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

সুতরাং আপনি সহজেই সংস্থান প্রতি গ্রাহকের তালিকা রাখতে পারেন এবং উত্সের প্রতিটি তালিকার সর্বশেষ নোডটি পরীক্ষা করতে পারেন (শেষ ক্রিয়াকলাপের সময় জানতে আপনার কোডটিতে আপনার গ্রাহকের জন্য কেবল তারিখের ক্ষেত্র যুক্ত করা দরকার)

আমি এসকিউএল এর সাথে পরিচিত নই, অতএব আমি HashMapতালিকা এবং তালিকার সাথে আমার উদাহরণ দিই তবে আমি নিশ্চিত যে এটি একই ধারণা: HashMap <Resource, List<Customer>>কখন Resourceকী হিসাবে রিসোর্সআইডি Customerথাকা উচিত এবং এতে গ্রাহক আইডি, তথ্য এবং অপারেশন তারিখ থাকা উচিত।

এই ধারণার সাহায্যে আপনি সর্বশেষ অপারেশন সময়টি সহজেই জানতে পারবেন এবং যে কোনও সংস্থান (resource সংস্থান সরান \ গ্রাহক যুক্ত করুন) সংশোধন করতে পারেন।


0

আপনি যদি স্কেলাইট ডাটাবেস ব্যবহার করেন, আপনি যদি ব্যাচের তারিখটি সারণির কলাম হিসাবেও যোগ করেন,

10| Title X       | 1 | Bob    | 2015-03-01
11| Another title | 1 | Bob    | 2015-03-01
...............................
10| Title X       | 1 | Alice  | 2015-03-05

শেষ এক্স সংখ্যাগুলিতে সংস্থানগুলি ব্যবহার না করা পেতে এসকিউএল ব্যবহার করা বেশ সহজ হবে

Select distinct r.ResourceID from Resources r
where not exists (SELECT julianday('now') - julianday(r.DateUpdated)) < X

আমি এসকিউএল পরীক্ষা করি নি তবে এটি আপনাকে ধারণা দেওয়া উচিত


0

মূল পোস্টটি থেকে, শোনা যাচ্ছে যে ডেটা প্রবেশের সময় লেনদেনের তারিখ / সময় নির্দেশ করার ক্ষেত্র নেই, এবং আমি অনুমান করি যে ফাইলটি দৈনিক, ঘন্টার পর ঘন্টা ইত্যাদির একটি সময়সূচির উপর ঘন ঘন ভিত্তিতে ইনজেক্ট করা হয় ume

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

তারপরে আপনি যে পার্থক্যটি প্রতিবেদন করতে চান তা জিজ্ঞাসা এবং গণনা করার জন্য আপনি একটি কাজের সময় নির্ধারণ করুন। "নতুন" যে লেনদেনগুলি হ'ল সেই লেনদেনগুলি যা আপনি "নতুন" বলার তারিখের আগে ডিবিতে কোনও রেকর্ড নেই। পুরানো রেকর্ডগুলি হ'ল কাট-অফ তারিখ থেকে কোনও লেনদেন নেই।


-2

হ্যাশ টেবিলের জন্য এটি কি নয়? যদি আপনি যা করতে চান তা হ'ল বিগত মাসে কোন সংস্থানগুলি ব্যবহার করা হয়েছে তার রেকর্ড রাখা এবং গত 18 মাসে যে সমস্ত সংস্থান অ্যাক্সেস করা হয়নি সেগুলি মুছে ফেলতে পারেন তবে আপনি হ্যাশ টেবিলটি ব্যবহার করতে পারেন যেখানে কীটি উত্স_আইডি এবং মানটি হ'ল শেষ অ্যাক্সেস তারিখ।

> 18 মাসের রেকর্ড সংরক্ষণাগার করার জন্য আপনি হ্যাশ টেবিলের সমস্ত রেকর্ডের মধ্য দিয়ে যেতে পারেন এবং কেবলমাত্র সেই নির্দিষ্ট রেকর্ডগুলি সরিয়ে (বা সরান) করতে পারেন। (প্রতিবেদন এলে আপনি এই সাপ্তাহিকটি করতে পারেন)


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

যদি টেবিলগুলি ডাটাবেসে সূচিযুক্ত হয় তবে সেগুলি মূলত পর্দার আড়ালে হ্যাশ টেবিলগুলিও। যদি আপনার কাছে 2 টি টেবিল থাকে তবে প্রত্যেকটি ডেটা সেট উপস্থাপন করে তবে আপনি কিছু বাইরের সাথে যোগ দিয়ে নিজের নতুন এবং সরানো রেকর্ড পেতে পারেন। রেফারেন্সের জন্য এটি দেখুন: i.stack.imgur.com/pxUO3.png । রিসোর্স_আইডি কলামে আপনার সূচী রয়েছে তা নিশ্চিত হয়ে নিন এবং এটি বেশ দ্রুত হওয়া উচিত। আপনি যদি এটিকে স্ক্র্যাচ থেকে বাস্তবায়ন করতে পারেন তবে আমি মনে করি যে হেশ টেবিলগুলি এখনও হে (1) মোড়িত সময়ে অনুসন্ধান / সন্নিবেশ / মোছার কাজ করতে পারে হিসাবে এখনও যেতে পারে। এটি করার জন্য আরও কার্যকর উপায় সম্পর্কে ভাবা যায় না।
অ্যাড্রিয়ান বুজিয়া

3
এমন আরও ভাল ডেটা স্ট্রাকচার রয়েছে যা হ্যাশ টেবিলটিতে ক্র্যামিংয়ের অতিরিক্ত পদক্ষেপ ছাড়াই বার্ধক্য পরিচালনা করে।

কিছু উল্লেখ করতে যত্নশীল?
অ্যাড্রিয়ান বুজিয়া

@ স্নোমান - আমি আশা করি যে আমি আরও কয়েকবার হার তুলতে পারব, আমি কেবল এই মন্তব্যে দৃhat়তার সাথে একমত হয়েছি
জে-বস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.