복붙노트

[SQL] SQL 서버 SELECT 마지막 N 행

SQL

SQL 서버 SELECT 마지막 N 행

이것은 알려진 문제입니다하지만, 내가 찾은 최고의 솔루션은 같은 것입니다 :

SELECT TOP N *
FROM MyTable
ORDER BY Id DESC

나는 열이 많은 테이블을했습니다. 시간이 많이 걸리기 때문에 해당 쿼리를 사용하는 수 없습니다. 그래서 어떻게 ORDER BY를 사용하지 않고 마지막 N 행을 선택하기 위해 무엇을 할 수 있는가?

편집하다

이 하나의 미안 중복 질문

해결법

  1. ==============================

    1.또한 파티션 기능으로 행 번호를 사용하여 작업을 수행 할 수 있습니다. 좋은 예는 여기에서 찾을 수 있습니다 :

    또한 파티션 기능으로 행 번호를 사용하여 작업을 수행 할 수 있습니다. 좋은 예는 여기에서 찾을 수 있습니다 :

  2. ==============================

    2.당신은 SQL 서버가이 SQL을 사용하여 마지막 N 행을 선택 할 수 있습니다 :

    당신은 SQL 서버가이 SQL을 사용하여 마지막 N 행을 선택 할 수 있습니다 :

    select * from tbl_name order by id desc limit N;
    
  3. ==============================

    3.나는 JonVD의 코드를 테스트하지만, 기가 매우 느렸다 발견했다.

    나는 JonVD의 코드를 테스트하지만, 기가 매우 느렸다 발견했다.

    이 코드는 0을했다.

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

    4.당신은 테이블에서 행의 마지막 번호를 선택합니다.

    당신은 테이블에서 행의 마지막 번호를 선택합니다.

    구문처럼 될 것입니다

     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)
    
  5. ==============================

    5.여기 아주 일반적인 방식 및 지원 SQL 서버

    여기 아주 일반적인 방식 및 지원 SQL 서버

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

    과 성능을 위해, 그것은 (서버 시스템에서 10,000 개 이상의 레코드를 1 초 미만) 나쁘지 않다

  6. ==============================

    6."이드"색인가요? 그렇지 않으면, 그런 짓을 할 수있는 중요한 것은 (나는 이미 색인 의심)입니다.

    "이드"색인가요? 그렇지 않으면, 그런 짓을 할 수있는 중요한 것은 (나는 이미 색인 의심)입니다.

    또한, 모든 열을 반환해야합니까? 당신이 실제로 완전히 ID 컬럼에 인덱스로 음식을 장만 할 수있다 컬럼의 작은 하위 집합을해야하는 경우 속도에 상당한 개선을받을 수 있습니다 - 예를 인덱스에 포함 된 다른 필드 ID 열에 클러스터되지 않은 인덱스를 가지고 있다면, 실제로 돌아갑니다 나머지 열을 얻을 수있는 클러스터 된 인덱스에 조회를 수행해야하고 많이 만드는 수 쿼리의 비용. 이 클러스터 인덱스 또는 쿼리에 반환 할 다른 모든 필드를 포함하는 클러스터되지 않은 인덱스의 경우에, 당신은 괜찮을 것이다.

  7. ==============================

    7.첫째로 당신은에서 기록 수를 얻을 최대량

    첫째로 당신은에서 기록 수를 얻을 최대량

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

    그리고 :

    SQL 서버 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 
    
  8. ==============================

    8.여기에서의 일이 당신에 의해 주문없이 시도 할 수 있지만, 나는 그것이 각 행이 고유해야합니다 생각합니다. N 원하는 행의 수, L은 테이블의 행 수입니다.

    여기에서의 일이 당신에 의해 주문없이 시도 할 수 있지만, 나는 그것이 각 행이 고유해야합니다 생각합니다. N 원하는 행의 수, L은 테이블의 행 수입니다.

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

    앞서 언급 한 바와 같이 리턴 로우는 정의된다.

    편집 :이 실제로 느린 개입니다. 어떤 값의 정말.

  9. ==============================

    9.

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

    10.이 쿼리는 올바른 순서로 마지막 N 행을 반환하지만 그것의 성능이 좋지 않습니다

    이 쿼리는 올바른 순서로 마지막 N 행을 반환하지만 그것의 성능이 좋지 않습니다

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

    11.마지막 값을 얻을 수있는 쿼리의 끝에서 ORDERBY와 DESC를 사용합니다.

    마지막 값을 얻을 수있는 쿼리의 끝에서 ORDERBY와 DESC를 사용합니다.

  12. ==============================

    12.이 질문에 꽤 잘 적합하지만,하지 않을 수 있습니다 ...

    이 질문에 꽤 잘 적합하지만,하지 않을 수 있습니다 ...

    오프셋 숫자 절은 행의 수를 건너 뛰고 그 후 행을 반환 할 수 있습니다.

    그 문서의 링크는 포스트 그레스이다; 이 사이베이스 / MS SQL 서버에 적용 나도 몰라.

  13. ==============================

    13.

    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
    
  14. ==============================

    14.MS는 T-SQL의 LIMIT를 지원하지 않습니다. 시간의 대부분은 그냥 MAX (ID)를 가져온 다음 뺍니다.

    MS는 T-SQL의 LIMIT를 지원하지 않습니다. 시간의 대부분은 그냥 MAX (ID)를 가져온 다음 뺍니다.

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

    ID가 순차적이 아닌 경우이 미만 10 개 개의 레코드를 반환합니다.

  15. ==============================

    15.기법 나는 최근 ROWS의 "읽기"가장 최근의 "N"비율로 쿼리를 제한하고 매우 큰 테이블 (100 + 백만 1+ 억 행) 가장 최근의 행을 조회하는 데 사용. 이 예를 들어 나는 비 역사적인 최근 날씨 데이터, 또는 최근 뉴스 피드 검색 또는 최근 GPS 위치 데이터 포인트 데이터에 대해이 작업을 수행, 실제 응용 프로그램입니다.

    기법 나는 최근 ROWS의 "읽기"가장 최근의 "N"비율로 쿼리를 제한하고 매우 큰 테이블 (100 + 백만 1+ 억 행) 가장 최근의 행을 조회하는 데 사용. 이 예를 들어 나는 비 역사적인 최근 날씨 데이터, 또는 최근 뉴스 피드 검색 또는 최근 GPS 위치 데이터 포인트 데이터에 대해이 작업을 수행, 실제 응용 프로그램입니다.

    당신이 당신의 행 예를 들어 테이블의 가장 최근의 TOP 5 %에 ​​있는지 확실하게 알고 있다면 이것은 큰 성능 향상입니다. 테이블에 인덱스가있는 경우에도, 그것은 더 100 개 + 백만 1+ 억 행이 테이블에있는 행의 5 %에 ​​possibilites을 제한하도록. 이전 데이터가 물리적 디스크 읽기 및뿐만 아니라 논리에서 메모리 읽기를 필요로 할 때는 특별히 그러하다.

    |이 SELECT TOP보다 더 잘 더 효율적입니다 PERCENT | 이 행을 선택하지만, 단지 데이터의 부분을 제한하지 않는 한 제한을 검색한다.

    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'
    
  16. ==============================

    16.에 의해 순서를 사용하지 않고 마지막 3 개 행을 표시하려면 :

    에 의해 순서를 사용하지 않고 마지막 3 개 행을 표시하려면 :

    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) 
    
  17. ==============================

    17.구문을 제외하고 사용해보십시오. 이 같은:

    구문을 제외하고 사용해보십시오. 이 같은:

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

    18.어쩌면 늦게, 그러나 여기에서 약간의 간단한이 그 질문을 해결 선택입니다.

    어쩌면 늦게, 그러나 여기에서 약간의 간단한이 그 질문을 해결 선택입니다.

    SELECT * FROM "TABLE" T ORDER BY "T.ID_TABLE" DESC LIMIT 5;
    
  19. from https://stackoverflow.com/questions/4193705/sql-server-select-last-n-rows by cc-by-sa and MIT license