programing

SQL Server SELECT LAST N 행

starjava 2023. 4. 7. 20:47
반응형

SQL Server SELECT LAST N 행

이것은 이미 알려진 질문이지만, 제가 찾은 최고의 해결책은 다음과 같습니다.

SELECT TOP N *
FROM MyTable
ORDER BY Id DESC

나는 많은 테이블이 있다.시간이 많이 걸리기 때문에 그 쿼리를 사용하는 것은 바람직하지 않다.ORDER BY를 사용하지 않고 마지막 N 행을 선택하려면 어떻게 해야 합니까?

편집

이 질문이 중복되어 죄송합니다.

SQL Server가 다음 조회를 사용하여 마지막 N개의 행을 선택하도록 할 수 있습니다.

select * from tbl_name order by id desc limit N;

Jon VD의 코드를 테스트해봤지만 매우 느린 6초였습니다.

이 코드는 0초 걸렸어요.

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

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

테이블에서 마지막 행 수를 선택하는 경우.

구문은 다음과 같습니다.

 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열을 얻을 수 있지만 주문은 descnding way를 보여줍니다.

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)

첫 번째로, 대부분의 레코드 카운트는

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

그 다음:

SQL Server 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 

SQL Server를 지원하는 일반적인 방법은 다음과 같습니다.

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

퍼포먼스 면에서는 나쁘지 않다(1만 개 이상의 레코드가 서버 머신에 있는 경우 1초 미만)

"Id"는 색인화되어 있습니까?그렇지 않은 경우 중요한 작업입니다(이미 인덱싱되어 있을 것으로 생각됩니다).

또한 모든 열을 반환해야 합니까?ID 열의 인덱스로 완전히 대응할 수 있는 작은 열의 하위 집합만 실제로 필요한 경우(예: 인덱스에 다른 필드가 포함되지 않은 상태에서 ID 열에 NONCLUSTED 인덱스가 있는 경우) 속도가 크게 향상될 수 있습니다.그러면 실제로 나머지 열을 반환하려면 클러스터된 인덱스를 조회해야 합니다. 그러면 쿼리 비용이 상당 부분 소요될 수 있습니다.조회에 반환할 다른 모든 필드가 포함된 클러스터된 색인 또는 비클러스터된 색인인 경우 문제가 없습니다.

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

이런 거 할 수고가 할 수 요.order by각각의 행이 고유해야 한다고 생각합니다. N입니다.L는 테이블 내의 행 수입니다.

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

앞에서 설명한 바와 같이 반환되는 행은 정의되어 있지 않습니다.

EDIT: 이것은 사실 개 속도가 느립니다.별로 가치가 없다.

매우 큰 테이블(1억 이상 또는 10억 행 이상)에서 MOST RECENT 행을 쿼리하는 데 사용하는 기술은 쿼리가 RECENT ROWS의 최근 "N" 비율만 "읽기"하도록 제한합니다.이것은 실제 응용 프로그램입니다. 예를 들어 비역사적인 최근 날씨 데이터, 최근 뉴스 피드 검색 또는 최근 GPS 위치 데이터 지점 데이터에 대해 이 작업을 수행합니다.

예를 들어, 행이 표의 가장 최근 상위 5%에 속한다는 것을 확실히 알고 있다면 이는 엄청난 성능 향상입니다.따라서 테이블에 인덱스가 있더라도 1억 개 이상의 행 또는 10억 개 이상의 행이 있는 테이블 내의 행의 5%로 가능성을 더욱 제한합니다.특히 오래된 데이터에서는 논리 메모리 읽기뿐만 아니라 물리 디스크 읽기도 필요합니다.

이것은 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'

MS는 t-sql에서 LIMIT을 지원하지 않습니다.대부분의 경우 MAX(ID)를 얻은 후 뺍니다.

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

ID가 순차적이지 않은 경우 10개 미만의 레코드가 반환됩니다.

이 쿼리는 마지막 N개의 행을 올바른 순서로 반환하지만 성능이 떨어집니다.

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

마지막 값을 가져오려면 쿼리 끝에 desc를 orderby와 함께 사용합니다.

이 질문에는 적합하지 않을 수 있지만…

OFFSET 절

이 절을 사용하면 여러 행을 건너뛰고 그 후에 행을 반환할 수 있습니다.

이 문서 링크는 Postgres입니다.Sybase/MS SQL Server에 적용되는지 모르겠습니다.

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

결과를 오름차순으로 얻기 위해

SELECT n.*
FROM
(
    SELECT *
    FROM MyTable
    ORDER BY id DESC
    LIMIT N
) n
ORDER BY n.id ASC

SQL Server를 사용하면서 이 문제를 해결했습니다.이 문제를 해결하기 위해 한 것은 결과를 내림차순으로 정렬하고 결과에 행 번호를 부여한 후 결과를 필터링하여 다시 되돌렸습니다.

  SELECT * 
  FROM (
    SELECT *
          ,[rn] = ROW_NUMBER() OVER (ORDER BY [column] DESC)
    FROM [table]
  ) A 
  WHERE A.[rn] < 3
  ORDER BY [column] ASC

간단한 복사 붙여넣기 답변

사용하지 않고 마지막 세 행을 표시하는 방법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) 

를 사용해 보세요.EXCEPT구문을 사용합니다.
다음과 같은 경우:

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

언급URL : https://stackoverflow.com/questions/4193705/sql-server-select-last-n-rows

반응형