SQL सर्वर पिछले N पंक्तियों का चयन करें


139

यह एक ज्ञात प्रश्न है, लेकिन सबसे अच्छा समाधान जो मैंने पाया है वह कुछ इस प्रकार है:

SELECT TOP N *
FROM MyTable
ORDER BY Id DESC

मेरे पास बहुत सी पंक्तियों वाली एक मेज है। यह उस क्वेरी का उपयोग करने के लिए एक सकारात्मकता नहीं है क्योंकि इसमें बहुत समय लगता है। तो मैं ORDER BY का उपयोग किए बिना अंतिम N पंक्तियों का चयन कैसे कर सकता हूं?

संपादित करें

क्षमा करें, इस एक के दोहराए गए प्रश्न


"अंतिम एन" से क्या अभिप्राय है? एक आदेश के बिना, "अंतिम एन" बहुत मतलब नहीं है। यदि आपका मतलब है "अंतिम एन डाला जाना है" तो आप एसक्यूएल सर्वर पर भरोसा नहीं कर सकते हैं जो आपको दे सकता है - आपको बेस के साथ आदेश का उपयोग करना चाहिए।
डैनियल रेनशॉ

@ डैनियल रेनशॉ: सभी सर्वर को ऑर्डर करने के लिए एसक्यूएल सर्वर को मजबूर किए बिना तालिका का अंतिम एन क्योंकि यह वास्तव में धीमा हो जाता है
डिएगो

अपने प्रश्न में क्वेरी है सबसे अच्छा तरीका है। यदि idइंडेक्स किया गया है तो यह सिर्फ उस इंडेक्स को रिवर्स में स्कैन करेगा और पहले 5 पंक्तियों के बाद बंद कर देगा। यदि इसे अनुक्रमित नहीं किया जाता है, तो इसे एक TOP Nप्रकार करने की आवश्यकता होगी । यह करने के किसी भी अन्य तरीके से भी बदतर नहीं होगा। यह पूरी तालिका को क्रमबद्ध नहीं करता है (हालाँकि इसे पूरी तालिका को स्कैन करने की आवश्यकता होगी)
मार्टिन स्मिथ

जवाबों:


38

आप इसे ROW NUMBER BY PARTITION फीचर का उपयोग करके भी कर सकते हैं। एक महान उदाहरण यहाँ पाया जा सकता है :

मैं नॉर्थविंड डेटाबेस के आदेश तालिका का उपयोग कर रहा हूं ... अब हम कर्मचारी 5 द्वारा रखे गए अंतिम 5 आदेशों को पुनः प्राप्त करते हैं:

SELECT ORDERID, CUSTOMERID, OrderDate
FROM
(
    SELECT ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY OrderDate DESC) AS OrderedDate,*
    FROM Orders
) as ordlist

WHERE ordlist.EmployeeID = 5
AND ordlist.OrderedDate <= 5

1
ROW NUMBER BY PARTITION फीचर एक तरह का उपयोग करता है .. आपको प्रत्येक रिकॉर्ड के लिए पंक्ति संख्याएँ निर्दिष्ट करने के लिए तालिका को सॉर्ट करने की आवश्यकता है ...
Sadhir

यह सच है, लेकिन कुछ प्रकार की प्रकृति के बिना यह बस काम नहीं करेगा, सबसे अच्छा समाधान प्रमुख स्तंभों को हिट करने के लिए सूचकांक करना है और उपरोक्त क्वेरी जैसी किसी चीज़ के साथ चलना है।
जोन्वाड

101

आप इस SQL ​​का उपयोग करके अंतिम N पंक्तियों का चयन करने के लिए SQL सर्वर बना सकते हैं:

select * from tbl_name order by id desc limit N;

2
संस्करण संगतता के बारे में कैसे?
फ्रैक्टालिस्टे जूल

63
यह SQL सर्वर में काम नहीं करता है। एक MySQL, PostgreSQL और SQLite फीचर की तरह लगता है।
टिम फ्राइसन

3
सभी प्रगणित उत्पाद निश्चित रूप से SQL सर्वर हैं। यदि आप MS SQL सर्वर के बारे में बात करना चाहते हैं, तो इसका नाम क्यों नहीं है?
gena2x

4
मैं उलझन में हूं, यह सवाल पूछता है कि "ORDER BY का उपयोग किए बिना" एक चुनिंदा क्वेरी कैसे बनाएं और आपके उत्तर में चयनित क्वेरी में "ऑर्डर बाय" है। क्या यह "बिना आदेश" द्वारा "किसी प्रकार का" आदेश है?
रॉबर्ट सिनक्लेयर

5
@ gena2x इस प्रश्न को SQL सर्वर टैग किया गया है। वह टैग Microsoft SQL सर्वर को संदर्भित करता है।
मार्टिन स्मिथ

51

मैंने जॉनवीडी के कोड का परीक्षण किया, लेकिन पाया कि यह बहुत धीमा था, 6 एस।

इस कोड ने 0s लिया।

SELECT TOP(5) ORDERID, CUSTOMERID, OrderDate    
FROM Orders where EmployeeID=5    
Order By OrderDate DESC

4
कितनी पंक्तियाँ ?? जब आप बहुत सारी पंक्तियाँ प्राप्त कर लेते हैं जो वास्तविक धीमी हो सकती हैं
डिएगो

@Diego क्यों है? यदि आप OrderDateअनुक्रमित हो गए हैं, तो क्वेरी के पहले या अंतिम एन पंक्तियों को चुनना अनिवार्य रूप से समान रूप से त्वरित होना चाहिए । मुझे लगता है कि वहाँ एक मौका OrderDateअच्छी तरह से सम्मिलित आदेश देने के लिए सहसंबंधित है, लेकिन यह एक साइड इफेक्ट सबसे अच्छा है, और अभी भी एक टेबल स्कैन की आवश्यकता है, नहीं? (और मुझे नहीं लगता कि यह जवाब देता है कि ओपी उनके प्रश्न के एक बेहतर वाक्यांश के रूप में इंगित करता है : यानी, छंटाई के बिना)
रफिन

1
@ डिगो - आप क्यों मानते हैं कि यह आपके द्वारा स्वीकार किए गए उत्तर की तुलना में कोई धीमा होगा?
मार्टिन स्मिथ

2
यह पंक्तियों को उल्टा कर देता है। फिर आपको मूल आदेश वापस पाने के लिए उनके द्वारा पुनः आदेश देना होगा।
मार्क

15

यदि आप किसी तालिका से पंक्तियों की अंतिम संख्या का चयन करना चाहते हैं।

सिंटेक्स की तरह होगा

 select * from table_name except select top 
 (numbers of rows - how many rows you want)* from table_name

ये कथन काम करते हैं लेकिन भिन्न तरीके हैं। आप लोगों को धन्यवाद।

 select * from Products except select top (77-10) * from Products

इस तरह से आप अंतिम 10 पंक्तियाँ प्राप्त कर सकते हैं, लेकिन आदेश अवरोही रास्ता दिखाएगा

select top 10 * from products
 order by productId desc 

 select * from products
 where productid in (select top 10 productID from products)
 order by productID desc

 select * from products where productID not in 
 (select top((select COUNT(*) from products ) -10 )productID from products)

7

बहुत सामान्य तरीके से और यहाँ SQL सर्वर का समर्थन करने के लिए है

SELECT TOP(N) *
FROM tbl_name
ORDER BY tbl_id DESC

और प्रदर्शन के लिए, यह खराब नहीं है (सर्वर मशीन पर 10,000 से अधिक रिकॉर्ड के लिए एक सेकंड से कम)


1
अच्छी तरह से 10'000 रिकॉर्ड कुछ भी नहीं है जहां आपको प्रदर्शन के बारे में दिमाग होना चाहिए। जब आप लाखों रिकॉर्ड के बारे में बात करना शुरू करते हैं तो आप प्रदर्शन के बारे में सोचना शुरू कर सकते हैं
डॉमॉ

6

क्या "आईडी" अनुक्रमित है? यदि नहीं, तो यह एक महत्वपूर्ण बात है (मुझे संदेह है कि यह पहले से ही अनुक्रमित है)।

इसके अलावा, क्या आपको सभी कॉलम वापस करने की आवश्यकता है? यदि आप वास्तव में केवल स्तंभों के एक छोटे उपसमुच्चय की जरूरत है, जिसे आप आईडी कॉलम पर सूचकांक द्वारा पूरी तरह से पूरा किया जा सकता है - जैसे कि यदि आपके पास आईडी कॉलम पर कोई गैर-सूचीबद्ध सूचकांक है, जैसे कोई अन्य नहीं है, तो आप गति में पर्याप्त सुधार कर सकते हैं। फ़ील्ड्स को इंडेक्स में शामिल किया जाता है, फिर इसे क्लस्टर इंडेक्स पर एक लुकअप करना होगा ताकि वास्तव में बाकी कॉलम वापस आ सकें और यह क्वेरी की लागत का एक बहुत कुछ कर सकता है। यदि यह एक सीमांकित सूचकांक है, या एक गैर-सूचीबद्ध सूचकांक है जिसमें अन्य सभी फ़ील्ड शामिल हैं जिन्हें आप क्वेरी में वापस करना चाहते हैं, तो आपको ठीक होना चाहिए।


6

सबसे पहले आप सबसे रिकॉर्ड संख्या प्राप्त करते हैं

 Declare @TableRowsCount Int
 select @TableRowsCount= COUNT(*) from <Your_Table>

और तब :

SQL सर्वर 2012 में

SELECT *
FROM  <Your_Table> As L
ORDER BY L.<your Field>
OFFSET <@TableRowsCount-@N> ROWS
FETCH NEXT @N ROWS ONLY;

SQL Server 2008 में

SELECT *
FROM 
(
SELECT ROW_NUMBER() OVER(ORDER BY ID) AS sequencenumber, *
FROM  <Your_Table>
    Order By <your Field>
) AS TempTable
WHERE sequencenumber > @TableRowsCount-@N 

4

यहां कुछ ऐसा है जिसे आप बिना किसी कोशिश के कर सकते हैं, order byलेकिन मुझे लगता है कि इसके लिए जरूरी है कि प्रत्येक पंक्ति अद्वितीय हो। Nआप चाहते हैं पंक्तियों Lकी संख्या है, तालिका में पंक्तियों की संख्या है।

select * from tbl_name except select top L-N * from tbl_name

जैसा कि पहले उल्लेख किया गया है, जो पंक्तियाँ वापस आ जाती हैं, अपरिभाषित होती हैं।

संपादित करें: यह वास्तव में कुत्ता धीमा है। वास्तव में कोई मूल्य नहीं।


4
select * from (select top 6 * from vwTable order by Hours desc) T order by Hours

2

यह क्वेरी अंतिम N पंक्तियों को सही क्रम में लौटाती है, लेकिन यह खराब है

select *
from (
    select top N *
    from TableName t
    order by t.[Id] desc
) as temp
order by temp.[Id]

2

अंतिम मान प्राप्त करने के लिए क्वेरी के अंत में ऑर्डरबी के साथ desc का उपयोग करें।


1

यह सवाल के लिए सही फिट नहीं हो सकता है, लेकिन ...

OFFSET क्लॉज

OFFSET numberखंड एक छोड़ करने में सक्षम बनाता संख्या पंक्तियों की और फिर उसके बाद पंक्तियों को वापस।

वह डॉक लिंक पोस्टग्रेज को है; मुझे नहीं पता कि यह Sybase / MS SQL सर्वर पर लागू होता है या नहीं।


1
DECLARE @MYVAR  NVARCHAR(100)
DECLARE @step  int
SET @step = 0;


DECLARE MYTESTCURSOR CURSOR
DYNAMIC 
FOR
SELECT col FROM [dbo].[table]
OPEN MYTESTCURSOR
FETCH LAST FROM MYTESTCURSOR INTO @MYVAR
print @MYVAR;


WHILE @step < 10
BEGIN   
    FETCH PRIOR FROM MYTESTCURSOR INTO @MYVAR
        print @MYVAR;
        SET @step = @step + 1;
END   
CLOSE MYTESTCURSOR
DEALLOCATE MYTESTCURSOR

1

MS, t-sql में LIMIT का समर्थन नहीं करता है। अधिकांश समय मैं सिर्फ MAX (ID) प्राप्त करता हूं और फिर घटाता हूं।

select * from ORDERS where ID >(select MAX(ID)-10 from ORDERS)

यह 10 से कम रिकॉर्ड वापस करेगा जब आईडी अनुक्रमिक नहीं होगा।


0

एक तकनीक जो मैं बहुत बड़ी तालिकाओं (100+ मिलियन या 1+ बिलियन पंक्तियों) में सबसे हाल ही में पंक्तियों को क्वेरी करने के लिए उपयोग करता हूं , जो हाल ही के "एन" प्रतिशत के रिकॉर्ड को "पढ़ने" के लिए सीमित कर रही है। यह वास्तविक विश्व अनुप्रयोग है, उदाहरण के लिए मैं गैर-ऐतिहासिक हाल के मौसम डेटा, या हाल के समाचार फ़ीड खोजों या हाल ही में जीपीएस स्थान डेटा बिंदु डेटा के लिए ऐसा करता हूं।

यह एक बहुत बड़ा प्रदर्शन सुधार है यदि आप निश्चित रूप से जानते हैं कि आपकी पंक्तियाँ उदाहरण के लिए तालिका के सबसे हाल के शीर्ष 5% में हैं। इस तरह कि अगर टेबल्स पर अनुक्रमित हैं, तो भी यह टेबल में पंक्तियों के केवल 5% पंक्तियों को सीमित करता है जिसमें 100+ मिलियन या 1+ बिलियन पंक्तियाँ होती हैं। यह विशेष रूप से ऐसा मामला है जब पुराने डेटा को भौतिक डिस्क रीड की आवश्यकता होगी और न केवल लॉजिकल इन मेमोरी रीड की ।

यह SELECT TOP की तुलना में अधिक कुशल है पर्केंट | लिमिट करें क्योंकि यह पंक्तियों का चयन नहीं करता है, लेकिन खोजे जाने वाले डेटा के हिस्से को सीमित करता है।

DECLARE @RowIdTableA BIGINT
DECLARE @RowIdTableB BIGINT
DECLARE @TopPercent FLOAT

-- Given that there is an Sequential Identity Column
-- Limit query to only rows in the most recent TOP 5% of rows
SET @TopPercent = .05
SELECT @RowIdTableA = (MAX(TableAId) - (MAX(TableAId) * @TopPercent)) FROM TableA
SELECT @RowIdTableB = (MAX(TableBId) - (MAX(TableBId) * @TopPercent)) FROM TableB

SELECT *
FROM TableA a
INNER JOIN TableB b ON a.KeyId = b.KeyId
WHERE a.Id > @RowIdTableA AND b.Id > @RowIdTableB AND
      a.SomeOtherCriteria = 'Whatever'

-1

उपयोग किए बिना अंतिम 3 पंक्तियों को प्रदर्शित करने के लिए order by:

select * from Lms_Books_Details where Book_Code not in 
 (select top((select COUNT(*) from Lms_Books_Details ) -3 ) book_code from Lms_Books_Details) 

1
यह अनुमानित परिणाम प्रदान नहीं करेगा। Sql सर्वर MSDN डॉक्स ( msdn.microsoft.com/en-us/library/ms189463.aspx ) के अनुसार: "जब ORDER द्वारा क्लॉज के संयोजन में TOP का उपयोग किया जाता है, तो परिणाम सेट पहले N संख्या के क्रम में सीमित हो जाता है। पंक्तियाँ, अन्यथा, यह अपरिभाषित क्रम में पंक्तियों की पहली N संख्या देता है। "
caveman_dick

-1

EXCEPTवाक्यविन्यास का उपयोग करके देखें ।
कुछ इस तरह:

   SELECT * 
    FROM   clientDetails 
    EXCEPT 
    (SELECT TOP (numbers of rows - how many rows you want) * 
     FROM   clientDetails) 

@Prafulla सूत्रधार के रूप में एक ही जवाब
DMK

-1

हो सकता है कि थोड़ी देर हो, लेकिन यहाँ एक सरल चयन है जो आपके प्रश्न को हल करता है।

SELECT * FROM "TABLE" T ORDER BY "T.ID_TABLE" DESC LIMIT 5;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.