Подтвердить что ты не робот

Как получить n-я строка в таблице SQL Server?

Как бы вы получили n-я строка (например, 5-я строка) из результата запроса в SQL Server?

4b9b3361

Ответ 1

SQL Server 2005 и новее:

with Records AS(select row_number() over(order by datecreated) as 'row', * 
                from Table)
select * from records
where row=5

Вы можете изменить порядок, чтобы определить, как сортировать данные для получения пятой строки.

Протестировано на моей локальной установке: Microsoft SQL Server 2005 - 9.00.4053.00 (X64) 26 мая 2009 14:13:01 Copyright (c) 1988-2005 Microsoft Developer Developer Edition (64-разрядная версия) в Windows NT 6.1 (Build 7600:)

Ответ 2

У вас есть много вариантов, основанных на этой ссылке. Все эти методы применимы к SQL 2000. Тот, который я использовал ранее, является опцией № 1, в которой вы берете 5-элементное подмножество, упорядоченное в одну сторону, а затем выбираете строку "TOP" из поднабора, заказанного другим способом. Отлично работает!

SELECT TOP 1 FName 
FROM 
( 
    SELECT TOP 5 FName 
    FROM Names 
    ORDER BY FName 
) sub 
ORDER BY FName DESC 

В SQL 2005 и более просто - у вас есть функции упорядочения строк, такие как ROW_NUMBER(), которые будут делать то, что вам нужно напрямую.

Ответ 3

С 2005 года доступна функция ROW_NUMBER().

SELECT * FROM
(
   SELECT r.*, ROW_NUMBER() OVER (ORDER BY SomeField ASC) AS RowNum
) sorty
WHERE RowNum = 5

Ответ 4


Вы можете использовать Common Expression (CTE) и функцию Window, ROW_NUMBER() (совместимость с SQL 2005), чтобы решить вашу проблему.

Предположим, что имя таблицы - tableOne и имеет три столбца (col1, col2, col3)

Чтобы сделать определение полным, вам нужно указать порядок, по которому вы хотите, чтобы строки были пронумерованы. Следующие скрипты должны помочь вам получить n-я строка таблицы.


--table definition
create table tableOne
(
    col1 varchar(10)
    ,col2 varchar(10)
    ,col3 varchar(10)
)
go
-- sample data creation
insert into tableOne VALUES ('c11','c12','c13')
insert into tableOne VALUES ('c21','c22','c23')
insert into tableOne VALUES ('c31','c32','c33')
insert into tableOne VALUES ('c41','c42','c43')
insert into tableOne VALUES ('c51','c52','c53')
insert into tableOne VALUES ('c61','c62','c63')
go
-- obtaining nth row using CTE and Window Function
WITH NthRowCTE AS
(
    SELECT
        ROW_NUMBER() OVER (ORDER BY col1) AS RNum
        , *
    FROM tableOne
)
SELECT * FROM NthRowCTE WHERE RNum = 5
GO

С CTE и функцией Window вы обладаете полной гибкостью для вывода данных так, как вы хотите.

Ответ 5

Если вы используете SQL Serever 2005 или выше, вы можете использовать функциональность CTE.

В противном случае вы можете использовать этот простой запрос

SELECT TOP 1 EmpID  
FROM  (SELECT TOP 5 EmpID FROM EmpMaster ORDER BY Salary) T
ORDER BY Emp DESC 

Ответ 6

A BIT больше/отличается от того, что вы просили, но вот некоторые вещи: Предположим, вам нужно найти n-я строка одной таблицы, в определенной последовательности данных и вставить значение из нее в другую таблицу, если ее уникальный идентификатор еще не находится в другой таблице. Это получает значение из первых таблиц n-й строки. myuniquecol - идентификатор /col, который идентифицирует группу строк, все из которых имеют одно и то же значение в первой таблице, которые имеют уникальные значения mydatetime

( SELECT TOP 1 mycol FROM
    ( SELECT TOP 5 * FROM  mytable
        WHERE mytable.myuniquecol NOT IN (select myuniquecol from myothertable)
        AND mytable.myuniquecol = myuniquecol
        ORDER BY myuniquecol asc, mydatetime desc
    ) AS me
  ORDER BY myuniquecol desc, mydatetime asc
) AS mycolnew

Это полезно для поиска n-й строки в одной таблице и вставки ее в качестве n-го столбца в другой таблице.

table1: myuniquecol, mycol, mydatetime

table2: myuniquecol, mycol1, mycol2, mycol3...

должен работать в любом SQL:)

ПРИМЕЧАНИЕ: mytable имеет столбец с именем mycol

EDIT: извлекли некоторые вещи из-за ограничения SQL SERVER в TOP

Ответ 7

ПРОСТОЙ

- вернуть первую запись

выберите * из заголовков a, где 1 = (выберите count (title_id) из заголовков b, где a.title_id >= b.title_id)

- вернуть вторую запись и т.д. выберите * из заголовков a, где 2 = (выберите count (title_id) из заголовков b, где a.title_id >= b.title_id)