SQL टेबल दिया
id date employee_type employee_level
1 10/01/2015 other 2
1 09/13/2011 full-time 1
1 09/25/2010 intern 1
2 09/25/2013 full-time 3
2 09/25/2011 full-time 2
2 09/25/2008 full-time 1
3 09/23/2015 full-time 5
3 09/23/2013 full-time 4
क्या ऐसे कर्मचारियों की खोज करना संभव है जिनके पास कर्मचारी_टाइप "इंटर्न" के साथ एक पंक्ति है, और तालिका में इसके ऊपर की पंक्ति (बाद की तारीख के साथ आईडी) कर्मचारी के साथ "पूर्णकालिक" है।
इस मामले में, आईडी 1 मेरी आवश्यकता को पूरा करता है।
आपका बहुत बहुत धन्यवाद!
उत्तर:
जवाब के लिए 2 № 1यह मानते हुए कि पिछली तारीख के साथ आपका वही आईडी है, तो आप उपयोग कर सकते हैं lag()
, अधिकांश डेटाबेस द्वारा समर्थित ANSI मानक फ़ंक्शन:
select t.*
from table t
where t.id in (select id
from (select t.*,
lag(employee_type) over (partition by id order by date) as prev_et
from table t
) tt
where tt.employee_type = "intern" and tt.prev_et = "full-time"
);
यदि आपका डेटाबेस t "समर्थन नहीं करता है lag()
, आप सहसंबद्ध उपश्रेणियों के साथ कुछ ऐसा ही कर सकते हैं।
उत्तर № 2 के लिए 1
मेरा मानना है कि अनुरोध isn "t जैसा कि प्रश्न में वर्णित है, इसके बजाय आप जो चाहते हैं वह उन लोगों के लिए सभी पंक्तियों की सूची है जो इंटर्न हैं।
SELECT
t1.*
FROM yourtable AS t1
INNER JOIN (
SELECT DISTINCT
id
FROM yourtable
WHERE employee_type = "intern"
) AS t2 ON t1.id = t2.id
;
वैकल्पिक रूप से आप केवल उन लोगों को चाह रहे होंगे जो "इंटर्न" और "पूर्णकालिक" दोनों हैं, जिस स्थिति में आप नीचे दिए गए क्वेरी का उपयोग कर सकते हैं जो एक HAVING खंड का उपयोग करता है:
SELECT
t1.*
FROM yourtable AS t1
INNER JOIN (
SELECT id
FROM yourtable
WHERE employee_type = "intern"
OR employee_type = "full-time"
GROUP BY id
HAVING COUNT(DISTINCT employee_type) > 1
) AS t2 ON t1.id = t2.id
;