जवाबों:
यदि आप केवल पहली चयनित पंक्ति चाहते हैं, तो आप निम्न कर सकते हैं:
select fname from MyTbl where rownum = 1
आप शीर्ष एक्स को ऑर्डर करने और लेने के लिए विश्लेषणात्मक कार्यों का उपयोग कर सकते हैं:
select max(fname) over (rank() order by some_factor) from MyTbl
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
top X
एक करने के लिए इसे बदल सकते हैंWHERE ROWNUM <= X
साथ ओरेकल 12C (जून 2013), आप निम्नलिखित की तरह उपयोग कर सकते हैं।
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
जाहिरा तौर पर आवश्यक नहीं है, आप उपयोग कर सकते हैं FETCH NEXT 1 ROWS ONLY
या यहां तक कि FETCH FIRST ROW ONLY
, आदेश महत्वपूर्ण है या यह सिर्फ एक का उपयोग करने के बराबर होगा WHERE rownum = 1
। मैंने इसे एक OUTER APPLY इंस्ट्रक्शन में भी आज़माया है और यह Ms-SQL के टॉप फंक्शन की तरह काम करता है।
TIES
। यह उन मामलों के लिए देखें , जब संस्करण के लिए संबंध होते हैं 12c +
और12c -
आप उप-क्वेरी में ROW_NUMBER()
एक ORDER BY
क्लॉज के साथ उपयोग कर सकते हैं और इस कॉलम को प्रतिस्थापन में बदल सकते हैं TOP N
। इसे चरण-दर-चरण समझाया जा सकता है।
नीचे दी गई तालिका देखें जिसमें दो कॉलम हैं NAME
और DT_CREATED
।
यदि आपको इसकी परवाह किए बिना केवल पहली दो तारीखें लेने की आवश्यकता है NAME
, तो आप नीचे दिए गए क्वेरी का उपयोग कर सकते हैं। तर्क क्वेरी के अंदर लिखा गया है
-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
-- Generates numbers in a column in sequence in the order of date
SELECT ROW_NUMBER() OVER (ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;
परिणाम
कुछ स्थितियों में, हमें TOP N
प्रत्येक से संबंधित परिणामों का चयन करना होगा NAME
। ऐसे मामले में हम उप-क्वेरी में PARTITION BY
एक ORDER BY
खंड के साथ उपयोग कर सकते हैं । नीचे दिए गए प्रश्न का संदर्भ लें।
-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
--Generates numbers in a column in sequence in the order of date for each NAME
SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;
परिणाम
with (select ... ) as
क्लॉज) इस समस्या के लिए कुछ भी नहीं बदलता है, सीटीई सिर्फ प्रश्नों को पढ़ने और समर्थन करने के उद्देश्य से है। सही? @ सारथ अवानवु
आप कुछ ऐसा कर सकते हैं
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
आप विश्लेषणात्मक कार्यों RANK और / या DENSE_RANK का भी उपयोग कर सकते हैं , लेकिन ROWNUM शायद सबसे आसान है।
उपयोग:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
यदि Oracle9i + का उपयोग कर रहे हैं, तो आप ROW_NUMBER () जैसे विश्लेषणात्मक कार्यों का उपयोग करके देख सकते हैं, लेकिन वे ROWNUM के रूप में भी प्रदर्शन नहीं करेंगे ।
तालिका से पहली पंक्ति चुनने के लिए और तालिका से एक पंक्ति चुनने के लिए दो अलग-अलग कार्य हैं और एक अलग क्वेरी की आवश्यकता है। ऐसा करने के कई संभावित तरीके हैं। उनमें से चार हैं:
प्रथम
select max(Fname) from MyTbl;
दूसरा
select min(Fname) from MyTbl;
तीसरा
select Fname from MyTbl where rownum = 1;
चौथा
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
मेरे पास एक ही मुद्दा था, और मैं इस समाधान के साथ इसे ठीक कर सकता हूं:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
शीर्ष पर पहला मान रखने से पहले आप अपना परिणाम ऑर्डर कर सकते हैं।
सौभाग्य