it-swarm.dev

مزود خدمة SELECT L الصفوف الأخيرة

هذا سؤال معروف ولكن أفضل حل وجدته هو:

SELECT TOP N *
FROM MyTable
ORDER BY Id DESC

لدي طاولة بها الكثير من الصفوف. ليس من الممكن استخدام هذا الاستعلام لأنه يستغرق الكثير من الوقت. فكيف يمكنني القيام به لتحديد N الصفوف الأخيرة دون استخدام ORDER BY؟

EDIT

آسف السؤال مكررة من هذا واحد

116
Diego

يمكنك القيام بذلك باستخدام ميزة ROW NUMBER BY PARTITION أيضًا. يمكن العثور على مثال رائع هنا :

أنا أستخدم جدول الطلبات في قاعدة بيانات Northwind ... الآن ، دعونا نسترجع آخر 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
34
JonVD

يمكنك جعل خادم SQL لتحديد صفوف N الأخيرة باستخدام SQL:

select * from tbl_name order by id desc limit N;
79
Niru Mukund Shah

اختبرت كود JonVD ، لكنني وجدت أنه بطيء جدًا ، 6s.

استغرق هذا الكود 0 ثانية.

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

إذا كنت ترغب في تحديد الأرقام الأخيرة من الصفوف من الجدول.

بناء الجملة سيكون مثل

 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)
14
Prafulla Sutradhar

هل "الرقم" مفهرسة؟ إذا لم يكن كذلك ، فهذا شيء مهم يجب القيام به (أظن أنه تم فهرسته بالفعل).

أيضا ، هل تحتاج إلى إرجاع جميع الأعمدة؟ قد تكون قادرًا على الحصول على تحسن كبير في السرعة إذا كنت بحاجة فعليًا إلى مجموعة فرعية أصغر من الأعمدة التي يمكن معالجتها بالكامل بواسطة الفهرس في عمود المعرف - على سبيل المثال إذا كان لديك فهرس غير مسجل في عمود المعرّف ، مع عدم تضمين أي حقول أخرى في الفهرس ، فسيتعين عليه إجراء بحث في الفهرس المجمّع للحصول على بقية الأعمدة فعليًا والتي يمكن أن تشكل الكثير من تكلفة الاستعلام. إذا كان الفهرس CLUSTERED ، أو الفهرس NONCLUSTERED الذي يتضمن جميع الحقول الأخرى التي تريد إرجاعها في الاستعلام ، فيجب أن تكون على ما يرام.

6
AdaTheDev

بطريقة عامة جدا ولدعم خادم SQL هنا هو

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

وللأداء ، ليس سيئًا (أقل من ثانية واحدة لأكثر من 10000 سجل على جهاز الخادم)

6
Hakam Fostok

أول ما تحصل عليه أكثر من سجل العد

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

وثم :

في SQL Server 2012

SELECT *
FROM  <Your_Table> As L
ORDER BY L.<your Field>
OFFSET <@[email protected]> 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 > @[email protected] 
5
Ardalan Shahgholi
select * from (select top 6 * from vwTable order by Hours desc) T order by Hours
4
fth

إليك شيء يمكنك تجربته بدون order by لكنني أعتقد أنه يتطلب أن يكون كل صف فريدًا. N هو عدد الصفوف التي تريدها ، L هو عدد الصفوف في الجدول.

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

كما لوحظ من قبل ، أي الصفوف التي يتم إرجاعها غير معرف.

تحرير: هذا هو في الواقع كلب بطيء. لا قيمة لها حقا.

4
Dzamo Norton

يعرض هذا الاستعلام آخر صفوف N بالترتيب الصحيح ، لكن أداءه رديء

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

استخدم desc مع orderby في نهاية الاستعلام للحصول على القيم الأخيرة.

2
Sara

قد لا يكون هذا مناسبًا تمامًا للسؤال ، ولكن ...

جملة OFFSET

تمكنك OFFSET number جملة من تخطي رقم من الصفوف ومن ثم إرجاع الصفوف بعد ذلك.

هذا الرابط وثيقة ل Postgres. لا أعرف إذا كان هذا ينطبق على Sybase/MS SQL Server.

1
Basil Bourque

أسلوب أستخدمه للاستعلام عن الأكثر حداثة الصفوف في جداول كبيرة جدًا (100+ مليون أو 1 + مليار صف) يقصر الاستعلام على "قراءة" فقط الأحدث "N" النسبة المئوية الأخيرة من الصفوف. هذه هي تطبيقات في العالم الحقيقي ، على سبيل المثال أقوم بذلك من أجل بيانات الطقس الحديثة غير التاريخية ، أو عمليات بحث موجز الأخبار الأخيرة أو بيانات نقطة موقع GPS الحديثة.

هذا هو تحسين كبير في الأداء إذا كنت على يقين من أن الصفوف الخاصة بك هي في أحدث 5 ٪ من الجدول على سبيل المثال. بحيث أنه حتى إذا كانت هناك فهارس على الجداول ، فإنه يحد من الإمكانيات إلى 5٪ فقط من الصفوف في الجداول التي تحتوي على أكثر من 100 مليون أو 1 مليار صف. هذا هو الحال خاصة عندما تتطلب البيانات القديمة القرص الفعلي القراءة وليس فقط المنطقي في الذاكرة يقرأ.

هذا أكثر كفاءة من SELECT TOP | PERCENT | LIMIT لأنها لا تحدد الصفوف ، ولكن فقط تحد من جزء البيانات المطلوب البحث عنه.

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'
0
CodeCowboyOrg
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
0
Slava