2008-11-22 24 views

Trả lời

3

Không có đơn đặt hàng, điều này là không thể. Điều gì định nghĩa "đáy"? Sau đây sẽ chọn 5 hàng theo cách chúng được lưu trữ trong cơ sở dữ liệu.

SELECT TOP 5 * FROM [TableName]

+0

Phải, bạn cũng có thể thêm "đơn đặt hàng theo colx desc" vào cuối 5 tùy thuộc vào chỉ mục. I E. đầu 5 * ĐƯỢC * dưới cùng 5 nếu bạn đảo ngược thứ tự. –

+0

Điều này không chính xác. Truy vấn này sẽ chọn 5 hàng ** nhưng không phải (luôn luôn) ** theo cách chúng được lưu trữ trong cơ sở dữ liệu. –

1

Bạn có thể truy xuất chúng từ bộ nhớ.
Vì vậy, đầu tiên bạn nhận được các hàng trong một Số liệu, và sau đó nhận được 5 cuối cùng của Số liệu.

34

Đây là chỉ là về truy vấn kỳ lạ nhất mà tôi từng viết, nhưng tôi khá chắc chắn rằng nó được "cuối cùng 5" hàng từ một bảng mà không đặt hàng:

select * 
from issues 
where issueid not in (
    select top (
     (select count(*) from issues) - 5 
    ) issueid 
    from issues 
) 

Lưu ý rằng điều này làm cho sử dụng SQL Server 2005 có khả năng chuyển một giá trị vào mệnh đề "top" - nó không hoạt động trên SQL Server 2000.

+0

Nếu cuối cùng, bạn có nghĩa là theo thứ tự của khóa cụm, sau đó tôi là xa mà không làm việc –

+0

Tôi đã thử nghiệm điều này trên một bảng mà không có một chỉ số nhóm, và nó trả về năm hàng cuối cùng mà tôi nhận được khi thực hiện "chọn * từ các vấn đề" đơn giản. –

+0

Và chỉ cần thử nó trên một bảng với một chính "int int" chính, và nó đã làm việc ở đó quá. Đã cho tôi hàng "năm cuối". –

2

Vâng, "năm hàng cuối cùng" thực sự là năm hàng cuối cùng tùy thuộc vào chỉ số nhóm của bạn. Chỉ số nhóm của bạn, theo định nghĩa, là cách mà các hàng được sắp xếp. Vì vậy, bạn thực sự không thể nhận được "năm hàng cuối cùng" mà không cần một số đơn đặt hàng. Bạn có thể, tuy nhiên, có được năm hàng cuối cùng vì nó liên quan đến chỉ số nhóm.

SELECT TOP 5 * FROM MyTable 
ORDER BY MyCLusteredIndexColumn1, MyCLusteredIndexColumnq, ..., MyCLusteredIndexColumnN DESC 
1

Có một trick ích mà làm việc ở một số cơ sở dữ liệu để đặt hàng trong trật tự cơ sở dữ liệu,

SELECT * FROM TableName ORDER BY đúng

Rõ ràng, điều này có thể làm việc kết hợp với bất kỳ khác các đề xuất được đăng ở đây để lại kết quả theo thứ tự "thứ tự mà chúng xuất hiện trong cơ sở dữ liệu", trong một số cơ sở dữ liệu, là thứ tự chúng được sửa đổi lần cuối.

8

Cách câu hỏi của bạn bị làm cho âm thanh như bạn nghĩ phải vất vả ically khu nghỉ mát dữ liệu trong bảng để có được nó trở lại theo thứ tự bạn muốn. Nếu vậy, đây không phải là trường hợp, mệnh đề ORDER BY tồn tại cho mục đích này. Thứ tự vật lý trong đó các hồ sơ được lưu trữ vẫn không thay đổi khi sử dụng ORDER BY. Các bản ghi được sắp xếp trong bộ nhớ (hoặc trong không gian đĩa tạm thời) trước khi chúng được trả về.

Lưu ý rằng thứ tự ghi nhận được trả lại không được bảo đảm mà không sử dụng mệnh đề ORDER BY. Vì vậy, trong khi bất kỳ gợi ý nào ở đây có thể hoạt động, không có lý do gì để nghĩ rằng chúng sẽ tiếp tục hoạt động, bạn cũng không thể chứng minh rằng chúng hoạt động trong mọi trường hợp với cơ sở dữ liệu hiện tại của bạn. Điều này là do thiết kế - tôi giả định nó là để cung cấp cho cơ sở dữ liệu tự do làm như nó sẽ với các hồ sơ để có được hiệu suất tốt nhất trong trường hợp không có thứ tự rõ ràng được chỉ định.

Giả sử bạn muốn 5 hồ sơ cuối cùng được sắp xếp theo tên trường trong thứ tự tăng dần, bạn có thể làm một cái gì đó như thế này, mà nên làm việc trong hoặc SQL 2000 hoặc 2005:

select Name 
from (
    select top 5 Name 
    from MyTable 
    order by Name desc 
) a 
order by Name asc 
+1

Điều này sẽ được đánh dấu là câu trả lời chính xác (và tương thích nhất). – AshesToAshes

2

Nếu bạn biết có bao nhiêu hàng sẽ có tổng số bạn có thể sử dụng hàm ROW_NUMBER(). Dưới đây là một examble từ MSDN (http://msdn.microsoft.com/en-us/library/ms186734.aspx)

USE AdventureWorks; 
GO 
WITH OrderedOrders AS 
(
    SELECT SalesOrderID, OrderDate, 
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber' 
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60; 
27

Giả sử bạn có một chỉ mục trên id, đây sẽ là nhanh như chớp:

SELECT * FROM [MyTable] WHERE [id] > (SELECT MAX([id]) - 5 FROM [MyTable]) 
+7

Điều này chỉ an toàn nếu bạn chưa xóa bất kỳ bản ghi nào. I E. nếu id tối đa = 100, nhưng bạn đã xóa bản ghi 99, bạn sẽ chỉ kết thúc với 4 bản ghi, chứ không phải là 5. – Amber

1
select * 
from table 
order by empno(primary key) desc 
fetch first 5 rows only 
+0

Như đã viết, chọn tất cả các hàng theo thứ tự giảm dần, không chỉ trước tiên 5. – JYelton

+0

@JYelton - No it doesn ' t. Chỉ hợp lệ trong SQL Server 2012 và bỏ qua yêu cầu "không phân loại". –

10
  1. Bạn cần phải đếm số hàng bên trong bảng (nói rằng chúng tôi có 12 hàng)
  2. rồi trừ 5 hàng khỏi chúng (chúng tôi hiện đang ở 7)
  3. chọn * nơi index_column> 7

    select * from users 
    where user_id > 
    ((select COUNT(*) from users) - 5) 
    

    bạn có thể ra lệnh cho họ ASC hoặc DESC

    Nhưng khi sử dụng mã này

    select TOP 5 from users order by user_id DESC 
    

    nó sẽ không được ra lệnh một cách dễ dàng.

-1

Lấy đếm bảng mà

select count(*) from TABLE 
select top count * from TABLE where 'primary key row' NOT IN (select top (count-5) 'primary key row' from TABLE) 
2
select * from table limit 5 offset (select count(*) from table) - 5; 
2

cuối 5 hàng lấy trong mysql


Truy vấn này làm việc một cách hoàn hảo

SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC 

hoặc

select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc 
2

Trong SQL Server 2012 bạn có thể làm điều này:

Declare @Count1 int ; 

Select @Count1 = Count(*) 
FROM [Log] AS L 

SELECT 
    * 
FROM [Log] AS L 
ORDER BY L.id 
OFFSET @Count - 5 ROWS 
FETCH NEXT 5 ROWS ONLY; 
1

Khi số hàng trong bảng là ít hơn 5 câu trả lời của Matt Hamilton và msuvajac là không đúng. Bởi vì giá trị số lượng hàng TOPN có thể không âm.
Một ví dụ tuyệt vời có thể được tìm thấy Here.

1

tôi đang sử dụng mã này:

select * from tweets where placeID = '$placeID' and id > (
    (select count(*) from tweets where placeID = '$placeID')-2) 
4

kiếm 5 hồ sơ từ các hồ sơ cuối cùng bạn có thể sử dụng này,

SELECT * 
FROM Table Name 
WHERE ID <= IDENT_CURRENT('Table Name') 
AND ID >= IDENT_CURRENT('Table Name') - 5 
0
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

Hãy thử điều này, nếu bạn không có một khóa chính hoặc cột giống hệt nhau:

select [Stu_Id],[Student_Name] ,[City] ,[Registered], 
     RowNum = row_number() OVER (ORDER BY (SELECT 0))  
from student 
ORDER BY RowNum desc 
Các vấn đề liên quan