SQL Server로 마지막 행을 읽는 방법


89

SQL Server에서 마지막 행을 읽는 가장 효율적인 방법은 무엇입니까?

테이블은 고유 키에 인덱싱됩니다. "하위"키 값은 마지막 행을 나타냅니다.

답변:


181

MS SQL을 사용하는 경우 다음을 시도 할 수 있습니다.

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

17
DB에 500 만 개의 레코드가 있다면 어떨까요! :-\
심층 분석

5
테이블이 정렬 열에서 인덱싱되면 SQL은 테이블의 마지막 행만 읽습니다. 값 비싼 정렬이나 전체 테이블 스캔이 필요하지 않습니다.
Spivonious

마지막 1000 개의 레코드를 가져와야하는 경우 어떻게 얻을 수
Sri

1
@Sri 실행 SELECT TOP 1000 * FROM table_name ORDER BY column_name DESC하고 마지막 1000 개의 레코드를 출력해야합니다.
Rod Argumedo


18

자동 채우기 기본 키 또는 datetime 열 (바람직하게는 기본 키)과 같이 테이블에 고유하게 식별되는 열이 필요합니다. 그런 다음 이렇게 할 수 있습니다.

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

ORDER BY column그 열의 데이터에 따른 결과를 rearange하도록 지시하고는 DESC(즉 제 마지막 퍼팅) 결과를 반전을 말한다. 그 후는 LIMIT 1한 행만 다시 전달 하도록 지시합니다.


6
MSSQL은 LIMIT를 사용하지 않습니다
Vinko Vrsalovic

4
와, 가혹한 원래 질문은 SQL Server를 구체적으로 언급하지도 않았습니다. 위의 솔루션은 SQL Server가 동일한 개념을 설명하기 위해 다른 단어를 사용하더라도 완벽하게 합법적입니다. +1
Greg Hewgill

11

귀하의 ID 중 일부가 순서가 맞다면 귀하의 db에 주문이 있다고 가정합니다.

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


4

아래 쿼리는 정렬 가능한 열없이 최대 성능으로 SQL Server에서 작동한다고 생각합니다.

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

당신이 그것을 이해하기를 바랍니다 ... :)


이것은 DESC를 정렬 할 수없고 반환되는 마지막 행만 필요한 경우에 가장 좋은 솔루션입니다.
jjthebig1

3

SQl Server 2008의 SQL 쿼리에서 last 사용을 시도했지만 " 'last'는 인식 된 내장 함수 이름이 아닙니다."라는 오류 메시지가 표시됩니다.

그래서 나는 다음을 사용했습니다.

select max(WorkflowStateStatusId) from WorkflowStateStatus 

마지막 행의 ID를 가져옵니다. 하나도 사용할 수 있습니다

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)


2

이 시도

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

1
@Vinko Vrsalovic의 위 주석에서 MSSQL은 LIMIT. 이 반환Incorrect syntax near LIMIT
frmbelz 19

1

MS SQL 데이터베이스 2005에 대한 테이블의 마지막 행을 검색하려면 다음 쿼리를 사용할 수 있습니다.

select top 1 column_name from table_name order by column_name desc; 

참고 : MS SQL 데이터베이스 2005에 대한 테이블의 첫 번째 행을 가져 오려면 다음 쿼리를 사용할 수 있습니다.

select top 1 column_name from table_name; 

2
select top 1주문 없이는 첫 번째 레코드를 얻을 수있는 신뢰할 수있는 방법이 아닙니다. 주문하지 않으면 SQL이 원하는 레코드를 제공하도록 허용합니다.
Code Magician 2012

1

OFFSETFETCH NEXT 결과를 표시하는 동안 SQL 페이징을 달성하기 위해 SQL 서버 2012의 기능입니다.

OFFSET인수는 결과의 반환 행에 시작하는 행을 결정하는 데 사용되며 FETCH인수는 행 수의 집합을 반환하는 데 사용됩니다.

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
우수 답변 마찬가지로 우리는 종업원에서 첫 번째 행 SELECT *를 얻을 수있는 [직원 ID] = (종업원 수에서 SELECT MIN ([직원 ID])) ALL
마나스

0

이것이 Access DB에서 마지막 레코드를 얻고 필드를 업데이트하는 방법입니다.

최신 정보 compalints SET tkt = addzone &'-'& customer_code &'-'& sn where sn in (select max(sn) from compalints )


0

정렬 된 열이없는 경우 각 행의 물리적 ID를 사용할 수 있습니다.

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

0

Replicated 테이블이있는 경우 localDatabase에 Identity = 1000, clientDatabase에 Identity = 2000을 가질 수 있으므로 마지막 ID를 잡으면 현재 연결된 데이터베이스의 마지막 ID가 아니라 항상 클라이언트의 마지막 ID를 찾을 수 있습니다. 따라서 마지막으로 연결된 데이터베이스를 반환하는 가장 좋은 방법은 다음과 같습니다.

SELECT IDENT_CURRENT('tablename')

0

나는 테이블에서 "마지막 가치"를 얻는 것이 아니라 금융 상품당 마지막 가치를 얻고 있습니다. 똑같지는 않지만 "지금 어떻게 됐는지"를 찾고자하는 사람들과 관련이 있다고 생각합니다. 또한 RowNumber () 및 CTE를 사용하여 1을 취하고 [column] desc로 정렬했습니다. 그러나 우리는 더 이상 ...

저는 SQL Server 2017을 사용하고 있으며, 전 세계 모든 거래소에서 모든 틱을 기록하고 있으며, 하루에 120 억 틱이 있으며, 틱의 볼륨과 속성 (입찰, 요청, 거래)을 포함하여 각 입찰, 요청 및 거래를 저장합니다. ).

해당 테이블에는 주어진 계약 (대부분 통계)에 대해 253 가지 유형의 틱 데이터가 있으며, 마지막 거래 가격은 틱 유형 = 4이므로 사용하는 가격의 "마지막"을 가져와야 할 때 :

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

내 개발 시스템에서 실행 계획이 매우 효율적으로 실행되고, 교환 가져 오기 ETL이 데이터를 테이블로 펌핑하는 동안 4 초 내에 실행되는 것을 볼 수 있습니다. 잠금이 느려질 것입니다 ... 그게 라이브 시스템이 작동하는 방식입니다. 85,697,659 개 행에 대한 실행 계획


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

사이트에 오신 것을 환영합니다. 이것은 주석 일 수 있습니다 (대표가있는 경우), 문제를 해결하는 방법을 설명하고 앞의 10 개 답변과 구별하기 위해 텍스트를 추가하여 확장 해 주시겠습니까?
gung-Monica 복원

-5

나는 그것이 다음과 같다고 확신합니다.

SELECT last(column_name) FROM table

비슷한 것을 사용하기 때문에 :

SELECT last(id) FROM Status

7
Last ()는 sql-server의 함수가 아닙니다
Taryn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.