Cách đọc hàng cuối cùng với SQL Server


88

Cách hiệu quả nhất để đọc hàng cuối cùng với SQL Server là gì?

Bảng được lập chỉ mục trên một khóa duy nhất - các giá trị khóa "dưới cùng" đại diện cho hàng cuối cùng.

Câu trả lời:


180

Nếu bạn đang sử dụng MS SQL, bạn có thể thử:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

17
Điều gì sẽ xảy ra nếu bạn có 5 triệu bản ghi trong DB! : - \
deepdive

4
Nếu bảng được lập chỉ mục trên cột sắp xếp, thì SQL sẽ chỉ đọc hàng cuối cùng của bảng. Không cần phân loại đắt tiền hoặc quét toàn bộ bảng.
Spivonious

Nếu tôi cần phải nhận được 1.000 hồ sơ cuối cùng làm thế nào để tôi nhận được, u có thể nói
Sri

1
@Sri Bạn sẽ thực thi SELECT TOP 1000 * FROM table_name ORDER BY column_name DESCvà sẽ xuất ra 1000 bản ghi cuối cùng.
Rod Argumedo

22
select whatever,columns,you,want from mytable
 where mykey=(select max(mykey) from mytable);

mykey là gì? trong trường hợp của tôi?
Mowgli

@Mowgli mykeylà chỉ mục bảng của bạn
Cliff Burton

2
Nếu mykeylà số nhận dạng duy nhất, cách tiếp cận này sẽ không hữu ích
Iman Mahmoudinasab

18

Bạn sẽ cần một số loại cột nhận dạng duy nhất trong bảng của mình, chẳng hạn như khóa chính tự động điền hoặc cột ngày giờ (tốt nhất là khóa chính). Sau đó, bạn có thể làm điều này:

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

Lệnh ORDER BY columncho nó thay đổi kết quả theo dữ liệu của cột đó và lệnh DESCcho nó đảo ngược kết quả (do đó đặt cái cuối cùng trước). Sau đó, LIMIT 1câu lệnh chỉ trả lại một hàng.


6
MSSQL không sử dụng LIMIT
Vinko Vrsalovic

4
Chà, thật khắc nghiệt, câu hỏi ban đầu thậm chí không nói cụ thể về SQL Server. Giải pháp trên là hoàn toàn hợp pháp mặc dù SQL Server sử dụng các từ khác nhau để mô tả cùng một khái niệm. +1
Greg Hewgill

11

Nếu một số id của bạn theo thứ tự, tôi cho rằng sẽ có một số thứ tự trong db của bạn

SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)


4

Tôi nghĩ rằng truy vấn dưới đây sẽ hoạt động cho SQL Server với hiệu suất tối đa mà không có bất kỳ cột nào có thể sắp xếp

SELECT * FROM table 
WHERE ID not in (SELECT TOP (SELECT COUNT(1)-1 
                             FROM table) 
                        ID 
                 FROM table)

Hy vọng bạn đã hiểu nó ... :)


Đây là giải pháp tốt nhất khi bạn không thể sắp xếp DESC và bạn chỉ cần hàng cuối cùng khi nó được trả về.
jjthebig1

3

Tôi đã thử sử dụng last trong truy vấn sql trong SQl server 2008 nhưng nó cho lỗi này: "'last' không phải là tên hàm tích hợp sẵn được công nhận."

Vì vậy, tôi đã kết thúc bằng cách sử dụng:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

để lấy Id của hàng cuối cùng. Người ta cũng có thể sử dụng

Declare @i int
set @i=1
select WorkflowStateStatusId from Workflow.WorkflowStateStatus
 where WorkflowStateStatusId not in (select top (
   (select count(*) from Workflow.WorkflowStateStatus) - @i ) WorkflowStateStatusId from .WorkflowStateStatus)

3

Bạn có thể sử dụng last_value: SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...

Tôi kiểm tra nó tại một trong những cơ sở dữ liệu của tôi và nó hoạt động như mong đợi.

Bạn cũng có thể kiểm tra tài liệu de tại đây: https://msdn.microsoft.com/en-us/library/hh231517.aspx


2

Thử đi

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

1
Như nhận xét ở trên của @Vinko Vrsalovic nói rằng MSSQL không sử dụng LIMIT. Điều này trở lạiIncorrect syntax near LIMIT
frmbelz

1

Để truy xuất hàng cuối cùng của bảng cho cơ sở dữ liệu MS SQL 2005, Bạn có thể sử dụng truy vấn sau:

select top 1 column_name from table_name order by column_name desc; 

Lưu ý: Để lấy hàng đầu tiên của bảng cho cơ sở dữ liệu MS SQL 2005, Bạn có thể sử dụng truy vấn sau:

select top 1 column_name from table_name; 

2
select top 1không có đơn đặt hàng không phải là cách đáng tin cậy để có được bản ghi đầu tiên. Nếu bạn không đặt hàng trước, bạn cho phép SQL cung cấp cho bạn bất kỳ bản ghi nào bạn muốn.
Code Magician

1

OFFSETFETCH NEXTlà một tính năng của SQL Server 2012 để đạt được phân trang SQL trong khi hiển thị kết quả.

Đối OFFSETsố được sử dụng để quyết định hàng bắt đầu trả về các hàng từ một kết quả và FETCHđối số được sử dụng để trả về một tập hợp số hàng.

SELECT *
FROM table_name
ORDER BY unique_column desc
OFFSET 0 Row
FETCH NEXT 1 ROW ONLY

0
SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)

1
Câu trả lời tốt nhất tương tự như chúng ta có thể nhận được hàng đầu tiên SELECT * từ nhân viên nơi [Nhân viên ID] = ALL (SELECT MIN ([Nhân viên ID]) từ nhân viên)
manas

0

Đây là cách bạn lấy bản ghi cuối cùng và cập nhật một trường trong Access DB.

CẬP NHẬT compalints SET tkt = addzone &'-'& customer_code &'-'& sn where sn in (select max(sn) from compalints )


0

Nếu bạn không có bất kỳ cột nào có thứ tự, bạn có thể sử dụng id vật lý của mỗi dòng:

SELECT top 1 sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot], 
              T.*
FROM MyTable As T
order by sys.fn_PhysLocFormatter(%%physloc%%) DESC

0

Nếu bạn có bảng Replicated, bạn có thể có Identity = 1000 trong localDatabase và Identity = 2000 trong clientDatabase, vì vậy nếu bạn bắt được ID cuối cùng, bạn có thể tìm thấy ID cuối cùng từ máy khách, không phải cuối cùng từ cơ sở dữ liệu được kết nối hiện tại. Vì vậy, phương pháp tốt nhất trả về cơ sở dữ liệu được kết nối cuối cùng là:

SELECT IDENT_CURRENT('tablename')

0

Tôi không nhận được "giá trị cuối cùng" trong bảng, tôi đang nhận Giá trị cuối cùng trên mỗi công cụ tài chính. Nó không giống nhau nhưng tôi đoán nó phù hợp với một số người đang muốn tìm kiếm "cách nó được thực hiện bây giờ". Tôi cũng đã sử dụng RowNumber () và CTE's và trước đó để chỉ cần lấy 1 và sắp xếp theo [cột] desc. tuy nhiên chúng ta cần ...

Tôi đang sử dụng SQL server 2017, chúng tôi đang ghi lại tất cả các dấu tích trên tất cả các sàn giao dịch trên toàn cầu, chúng tôi có ~ 12 tỷ tích tắc mỗi ngày, chúng tôi lưu trữ từng Giá thầu, yêu cầu và giao dịch bao gồm khối lượng và các thuộc tính của một dấu ) của bất kỳ sàn giao dịch nhất định.

Chúng tôi có 253 loại dữ liệu đánh dấu cho bất kỳ hợp đồng nhất định nào (chủ yếu là số liệu thống kê) trong bảng đó, giá giao dịch cuối cùng là loại đánh dấu = 4, vì vậy, khi chúng ta cần lấy "cuối cùng" của Giá, chúng ta sử dụng:

select distinct T.contractId,
LAST_VALUE(t.Price)over(partition by t.ContractId order by created ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
from [dbo].[Tick] as T
where T.TickType=4

Bạn có thể thấy kế hoạch thực thi trên hệ thống nhà phát triển của tôi, nó thực thi khá hiệu quả, thực hiện trong 4 giây trong khi ETL nhập trao đổi đang bơm dữ liệu vào bảng, sẽ có một số khóa làm chậm tôi ... đó chỉ là cách hệ thống trực tiếp hoạt động. kế hoạch thực hiện chống lại 85.697.659 hàng


-1
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)

Chào mừng đến với trang web. Đây có thể là một nhận xét (nếu bạn có đại diện), bạn có phiền mở rộng nó bằng cách thêm một số văn bản để giải thích cách nó giải quyết vấn đề và để phân biệt nó với 10 câu trả lời trước đó không?
gung - Phục hồi Monica

-5

Tôi khá chắc chắn rằng đó là:

SELECT last(column_name) FROM table

Bởi vì tôi sử dụng một cái gì đó tương tự:

SELECT last(id) FROM Status

7
Last () không phải là một hàm của sql-server
Taryn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.