IT

T-SQL 표에서 두 번째 행만 선택하는 방법은 무엇입니까?

itgroup 2023. 6. 22. 21:42
반응형

T-SQL 표에서 두 번째 행만 선택하는 방법은 무엇입니까?

제가 자리가 있는데 두 번째 줄의 아이디를 찾아야 합니다.어떻게 그것을 달성합니까?

타고Top 2두 개의 첫 번째 행을 선택하지만 두 번째 행만 선택하면 됩니다.

SQL Server 2012+에서는 OFFSET...을 사용할 수 있습니다.가져오기:

SELECT
   <column(s)>
FROM
   <table(s)>
ORDER BY
   <sort column(s)>
OFFSET 1 ROWS   -- Skip this number of rows
FETCH NEXT 1 ROWS ONLY;  -- Return this number of rows

SQL Server 2005+를 두 번째 행만 가져오는 방법의 예로 가정합니다(질문하실 수도 있습니다). 그 이유는 다음과 같습니다.top당신에게 안 먹힐까요?)

set statistics io on

;with cte as
(
  select *
    , ROW_NUMBER() over (order by number) as rn
  from master.dbo.spt_values
) 
select *
from cte
where rn = 2

/* Just to add in what I was running RE: Comments */
;with cte as
(
  select top 2 *
    , ROW_NUMBER() over (order by number) as rn
  from master.dbo.spt_values
) 
select *
from cte
where rn = 2

필드 ID가 고유한 경우 행 번호 함수가 필요하지 않습니다.

SELECT TOP 1 *
FROM (
  SELECT TOP 2 * 
  FROM yourTable
  ORDER BY ID
) z
ORDER BY ID DESC

사용하다ROW_NUMBER()행에 번호를 매기려면, 그러나 사용TOP처음 두 개만 처리할 수 있습니다.

사용해 보십시오.

DECLARE @YourTable table (YourColumn int)
INSERT @YourTable VALUES (5)
INSERT @YourTable VALUES (7)
INSERT @YourTable VALUES (9)
INSERT @YourTable VALUES (17)
INSERT @YourTable VALUES (25)

;WITH YourCTE AS
(
  SELECT TOP 2
    *, ROW_NUMBER() OVER(ORDER BY YourColumn) AS RowNumber
  FROM @YourTable
) 
SELECT *
FROM YourCTE
WHERE RowNumber=2

출력:

YourColumn  RowNumber
----------- --------------------
7           2

(1 row(s) affected)

사용할 수 있습니다.OFFSET그리고.FETCH NEXT

SELECT id
FROM tablename
ORDER BY column
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;

참고:

ORDER BY 절에는 ORDER BY 절만 사용할 수 있습니다.그것은 단독으로 사용할 수 없습니다.

OFFSET 값은 0보다 크거나 같아야 합니다.음수일 수 없습니다. 그렇지 않으면 오류가 반환됩니다.

OFFSET 인수는 결과 집합에서 행을 반환하는 시작점을 식별하는 데 사용됩니다.기본적으로 첫 번째 레코드 집합은 제외됩니다.

FETCH 인수는 일련의 행 수를 반환하는 데 사용됩니다.FETCH 자체는 사용할 수 없습니다. FETCH는 OFFSET과 함께 사용됩니다.

SQL 2005 이상을 사용하고 있을 것입니다.두 번째 줄은 다음을 사용하여 상위 2개 행을 선택합니다.ORDER BY ROW_COUNT DESC두 번째 행이 첫 번째 행으로 정렬된 다음 TOP 1을 사용하여 선택됩니다.

SELECT TOP 1 COLUMN1, COLUMN2
from (
  SELECT TOP 2 COLUMN1, COLUMN2
  FROM Table
) ORDER BY ROW_NUMBER DESC 
with T1 as
(
  select row_number() over(order by ID) rownum, T2.ID
  from Table2 T2
)
select ID
from T1
where rownum=2

사용하다TOP 2SELECT에서 원하는 수의 행을 출력합니다.그러면 데이터가 생성된 순서대로 반환됩니다.날짜 옵션이 있는 경우 날짜별로 주문할 수 있습니다.TOP n조항

상위 2개 행을 가져오려면;

SELECT TOP 2 [Id] FROM table 

특정 필드별로 상위 2개 행 순서를 지정하는 방법

SELECT TOP 2 [ID] FROM table ORDER BY <YourColumn> ASC/DESC

두 번째 행만 가져오려면;

WITH Resulttable AS 
( 
  SELECT TOP 2 
    *, ROW_NUMBER() OVER(ORDER BY YourColumn) AS RowNumber 
  FROM @Table 
)  
SELECT *
FROM Resultstable
WHERE RowNumber = 2

Select top 2 [id] from table Order by [id] desc최신 두 행을 추가해야 합니다.

하지만, 당신은 특히 주의를 기울여야 할 것입니다.order by반환되는 첫 번째 행과 두 번째 행을 결정하는 절입니다.

쿼리를 이렇게 변경해야 하는 경우:

Select top 2 [id] from table Order by ModifiedDate desc

당신은 두 개의 다른 행을 얻을 수 있습니다.주문에 사용할 열을 명세서별로 결정해야 합니다.

저는 위의 것들보다 훨씬 쉬운 방법을 가지고 있습니다.

DECLARE @FirstId int, @SecondId int

    SELECT TOP 1 @FirstId = TableId from MyDataTable ORDER BY TableId 
    SELECT TOP 1 @SecondId = TableId from MyDataTable WHERE TableId <> @FirstId  ORDER BY TableId 

SELECT @SecondId 

TOP 2를 원할 경우 TOP은 분명 도움이 될 것입니다. 하지만 개별적으로 필요한 경우에는 해당 값으로 작업을 수행할 수 있도록 ROW_NUMBER를 사용하면 선택할 행을 더 잘 제어할 수 있습니다.

ps. OP가 셀렉트에서 간단한 TOP 2를 노리는 것인지 확실하지 않아서 이렇게 했습니다. (제가 틀릴 수도 있어요!)

-- Get first row, same as TOP 1
SELECT [Id] FROM 
(
    SELECT [Id], ROW_NUMBER() OVER (ORDER BY [Id]) AS Rownumber
    FROM table
) results
WHERE results.Rownumber = 1

-- Get second row only
SELECT [Id] FROM 
(
    SELECT [Id], ROW_NUMBER() OVER (ORDER BY [Id]) AS Rownumber
    FROM table
) results
WHERE results.Rownumber = 2
SELECT *
FROM (
  SELECT top 3 *
    , ROW_NUMBER() OVER (ORDER BY [newsid] desc) AS Rownumber
  FROM news
  where (news_type in(2,12))
) results
WHERE results.Rownumber = 1

뉴스 테이블 이름 및 newsid 열 이름

이것도 유용합니다.

SELECT t.*
FROM (
  SELECT e1.*
    , row_number() OVER (ORDER BY e1.Rate DESC) AS _Rank
  FROM
  HumanResources.EmployeePayHistory AS e1
) AS t
WHERE t._Rank = 2

SQLDiver와 Taha Ali의 의견을 바탕으로 한 비교적 간단한 솔루션이 있습니다.

함수 ORIGINAL_LOGIN()에서 검색한 'domain\username'이 포함된 문자열이 있으며 도메인 구성 요소가 필요하지 않다고 가정합니다.

제1접근법

DECLARE @Login NVARCHAR(100)
SELECT @Login = 'domain\username'
-- SELECT @Login = ORIGINAL_LOGIN()

SELECT
    VALUE
FROM
    STRING_SPLIT(@Login, '\')

행이 2개인 테이블을 반환합니다.첫 번째 행은 도메인을 보유하고 두 번째 행은 요청된 사용자 이름을 보유합니다.

사용.

DECLARE @Login NVARCHAR(100)
SELECT @Login = 'domain\username'
-- SELECT @Login = ORIGINAL_LOGIN()

SELECT
    VALUE
FROM
    STRING_SPLIT(@Login, '\')
ORDER BY
    (SELECT NULL)
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;

임시 테이블에서 정확히 두 번째 행을 반환합니다.

또 다른 아이디어는 다음과 같습니다.

 SELECT MIN(id) FROM
     (
      SELECT TOP 2(TAB.[id])
          FROM TAB 
          where TAB.field1 =3
           ORDER BY TAB.[creationDate] DESC
          ) AS TEST
     )
select *
from (
  select ROW_NUMBER() OVER (ORDER BY Column_Name) as ROWNO, *
  from Table_Name
) Table_Name
where ROWNO = 2
SELECT TOP 2 [Id] FROM table

언급URL : https://stackoverflow.com/questions/3617152/t-sql-how-to-select-only-second-row-from-a-table

반응형