কোনটির সর্বোচ্চ তারিখ বা সর্বশেষ তারিখ রয়েছে তা নির্বাচন করুন


15

এখানে দুটি টেবিল দেওয়া আছে।

বিদ্যালয় কর্মচারিবর্গ

SCHOOL_CODE + STAFF_TYPE_NAME + LAST_UPDATE_DATE_TIME + PERSON_ID
=================================================================
ABE           Principal         24-JAN-13               111222
ABE           Principal         09-FEB-12               222111

একজন ব্যক্তির

PERSON_ID + NAME
=================
111222      ABC
222111      XYZ

এখানে আমার ওরাকল ক্যোয়ারী।

SELECT MAX(LAST_UPDATE_DATE_TIME) AS LAST_UPDATE, SCHOOL_CODE, PERSON_ID
FROM SCHOOL_STAFF
WHERE STAFF_TYPE_NAME='Principal'
GROUP BY SCHOOL_CODE, PERSON_ID
ORDER BY SCHOOL_CODE;

যা এই ফলাফল দেয়

LAST_UPDATE SCHOOL_CODE PERSON_ID
===========+===========+=========
24-JAN-13   ABE         111222
09-FEB-12   ABE         222111

আমি বিদ্যালয়ের জন্য প্রথমটি নির্বাচন করতে চাই যার সর্বশেষ তারিখ রয়েছে।

ধন্যবাদ।

উত্তর:


28

আপনার বর্তমান ক্যোয়ারী পছন্দসই ফলাফল দিচ্ছে না কারণ আপনি কলামে এমন একটি GROUP BYধারা ব্যবহার করছেন PERSON_IDযা উভয় প্রবেশের জন্য একটি অনন্য মূল্য। ফলস্বরূপ আপনি উভয় সারি ফিরে আসবেন।

কয়েকটি উপায় রয়েছে যা আপনি এটি সমাধান করতে পারেন। আপনি max(LAST_UPDATE_DATE_TIME)প্রতিটি জন্য ফেরত যোগাড়ী ফাংশন প্রয়োগ করতে একটি subquery ব্যবহার করতে পারেন SCHOOL_CODE:

select s1.LAST_UPDATE_DATE_TIME,
  s1.SCHOOL_CODE,
  s1.PERSON_ID
from SCHOOL_STAFF s1
inner join
(
  select max(LAST_UPDATE_DATE_TIME) LAST_UPDATE_DATE_TIME,
    SCHOOL_CODE
  from SCHOOL_STAFF
  group by SCHOOL_CODE
) s2
  on s1.SCHOOL_CODE = s2.SCHOOL_CODE
  and s1.LAST_UPDATE_DATE_TIME = s2.LAST_UPDATE_DATE_TIME;

ডেমো সহ এসকিউএল ফিডল দেখুন

অথবা আপনি প্রতিটি বিদ্যালয়ের সর্বাধিক সাম্প্রতিককালের সাথে ডেটার সারিগুলি ফিরিয়ে আনতে উইন্ডোটিং ফাংশনটি ব্যবহার করতে পারেন LAST_UPDATE_DATE_TIME:

select SCHOOL_CODE, PERSON_ID, LAST_UPDATE_DATE_TIME
from
(
  select SCHOOL_CODE, PERSON_ID, LAST_UPDATE_DATE_TIME,
    row_number() over(partition by SCHOOL_CODE 
                        order by LAST_UPDATE_DATE_TIME desc) seq
  from SCHOOL_STAFF
  where STAFF_TYPE_NAME='Principal'
) d
where seq = 1;

ডেমো সহ এসকিউএল ফিডল দেখুন

এই কোয়েরিটি প্রয়োগ করে row_number()যা পার্টিশনের প্রতিটি সারিতে একটি স্বতন্ত্র সংখ্যা নির্ধারণ SCHOOL_CODEকরে এবং এর উপর ভিত্তি করে একটি অবতরণ ক্রমে স্থাপন করে LAST_UPDATE_DATE_TIME

পার্শ্ব নোট হিসাবে, সামগ্রিক ক্রিয়াকলাপের সাথে যুক্ত হওয়া row_number()সংস্করণটির সাথে ঠিক একই নয় । আপনার যদি একই ইভেন্টের সময় সহ দুটি সারি থাকে তবে JOIN উভয় সারি ফিরিয়ে দেবে, যখন row_number()কেবলমাত্র একটিটি ফিরে আসবে । যদি আপনি উভয় উইন্ডোটিং ফাংশন দিয়ে ফিরতে চান rank()তবে তার পরিবর্তে উইন্ডোটিং ফাংশনটি ব্যবহার করার কথা বিবেচনা করুন কারণ এটি বন্ধনগুলি ফিরিয়ে দেবে:

select SCHOOL_CODE, PERSON_ID, LAST_UPDATE_DATE_TIME
from
(
  select SCHOOL_CODE, PERSON_ID, LAST_UPDATE_DATE_TIME,
    rank() over(partition by SCHOOL_CODE 
                        order by LAST_UPDATE_DATE_TIME desc) seq
  from SCHOOL_STAFF
  where STAFF_TYPE_NAME='Principal'
) d
where seq = 1;

ডেমো দেখুন


4

আমি অবাক হয়েছি কেউ সারি_নম্বরের বাইরে উইন্ডো ফাংশনগুলির সুবিধা গ্রহণ করেনি ()

খেলতে এখানে কিছু ডেটা রয়েছে:

CREATE TABLE SCHOOL_STAFF
(
LAST_UPDATE_DATE_TIME VARCHAR(20),
SCHOOL_CODE VARCHAR(20),
PERSON_ID VARCHAR(20),
STAFF_TYPE_NAME VARCHAR(20)
);
INSERT INTO SCHOOL_STAFF VALUES ('24-JAN-13', 'ABE', '111222', 'Principal');
INSERT INTO SCHOOL_STAFF VALUES ('09-FEB-12', 'ABE', '222111', 'Principal');

ওভার () ধারাটি একটি উইন্ডো তৈরি করে যার জন্য আপনি আপনার সামগ্রিক গোষ্ঠীগুলি সংজ্ঞায়িত করবেন। এই ক্ষেত্রে, আমি কেবল SHOOL_CODE এ পার্টিশন করছি, সুতরাং আমরা FIRST_VALUE দেখতে পাব, যা এসএইচওওএল_সিইডি দ্বারা গোষ্ঠীযুক্ত LAST_UPDATE_DATE_TIME থেকে আসবে এবং LAST_UPDATE_DATE_TIME এর ক্রমানুসারে ক্রম অনুসারে আসবে। এই মানটি প্রতিটি SCHOOL_CODE এর জন্য পুরো কলামে প্রয়োগ করা হবে।

ওভার () ধারাটিতে আপনার বিভাজন এবং ক্রমটি মনোযোগ দেওয়ার জন্য গুরুত্বপূর্ণ।

SELECT DISTINCT
 FIRST_VALUE(LAST_UPDATE_DATE_TIME) OVER (PARTITION BY SCHOOL_CODE ORDER BY LAST_UPDATE_DATE_TIME DESC) AS LAST_UPDATE
,FIRST_VALUE(SCHOOL_CODE)           OVER (PARTITION BY SCHOOL_CODE ORDER BY LAST_UPDATE_DATE_TIME DESC) AS SCHOOL_CODE
,FIRST_VALUE(PERSON_ID)             OVER (PARTITION BY SCHOOL_CODE ORDER BY LAST_UPDATE_DATE_TIME DESC) AS PERSON_ID
FROM SCHOOL_STAFF
WHERE STAFF_TYPE_NAME = 'Principal'
ORDER BY SCHOOL_CODE

রিটার্নস:

24-JAN-13   ABE 111222

এটি বেশিরভাগ ক্ষেত্রে গ্রোপ বাই এবং সাবকুইরিজের আপনার প্রয়োজনকে দূর করতে হবে। আপনি যদিও DISTINCT অন্তর্ভুক্ত করবেন তা নিশ্চিত করতে চাইবেন।


1
select LAST_UPDATE_DATE_TIME as LAST_UPDATE,
  SCHOOL_CODE,
  PERSON_ID
from SCHOOL_STAFF
WHERE STAFF_TYPE_NAME='Principal'
AND LAST_UPDATE_DATE_TIME = (SELECT MAX(LAST_UPDATE_DATE_TIME)
                            FROM SCHOOL_STAFF s2
                            WHERE PERSON_ID = s2.PERSON_ID)

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