Если вы, к сожалению, не используете .NET4:
string.Format("{0}h{1}m{2}s",
myTimeSpan.Hours,
myTimeSpan.Minutes,
myTimeSpan.Seconds);
Есть способы сделать это в необязательных частях стандарта, но многие базы данных поддерживают их собственный способ сделать это.
Действительно хороший сайт, который говорит об этом и других вещах, - http://troels.arvin.dk/db/rdbms/#select-limit .
В принципе, PostgreSQL и MySQL поддерживают нестандартные:
SELECT...
LIMIT y OFFSET x
Oracle, DB2 и MSSQL поддерживают стандартные функции окон:
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
columns
FROM tablename
) AS foo
WHERE rownumber <= n
(которые я только что скопировал с сайта, связанного выше, так как я никогда не использую эти БД)
Обновление: Начиная с PostgreSQL 8.4 поддерживаются стандартные функции оконной обработки, поэтому ожидаем, что второй пример будет работать и для PostgreSQL.
SELECT * FROM emp a
WHERE n = (SELECT COUNT( _rowid)
FROM emp b
WHERE a. _rowid >= b. _rowid);
Когда мы работали в MSSQL 2000, мы сделали то, что мы назвали «triple-flip»:
EDITED
DECLARE @InnerPageSize int
DECLARE @OuterPageSize int
DECLARE @Count int
SELECT @Count = COUNT(<column>) FROM <TABLE>
SET @InnerPageSize = @PageNum * @PageSize
SET @OuterPageSize = @Count - ((@PageNum - 1) * @PageSize)
IF (@OuterPageSize < 0)
SET @OuterPageSize = 0
ELSE IF (@OuterPageSize > @PageSize)
SET @OuterPageSize = @PageSize
DECLARE @sql NVARCHAR(8000)
SET @sql = 'SELECT * FROM
(
SELECT TOP ' + CAST(@OuterPageSize AS nvarchar(5)) + ' * FROM
(
SELECT TOP ' + CAST(@InnerPageSize AS nvarchar(5)) + ' * FROM <TABLE> ORDER BY <column> ASC
) AS t1 ORDER BY <column> DESC
) AS t2 ORDER BY <column> ASC'
PRINT @sql
EXECUTE sp_executesql @sql
Это было не изящно, и это был не быстрым, но он работал.
IF / ELSE IF
ниже вычисления OuterPageSize
- на страницах 1 и 2 они вернут значение OuterPageSize
до 10. На странице 3 (строки 21-25) расчет будет правильно возвращать 5 , а на всех страницах 4 и выше отрицательный результат вычисления будет заменен на 0 (хотя, вероятно, просто быстрее будет сразу возвращать пустую строку данных в этой точке).
– Adam V
1 January 2012 в 03:50
SQL SERVER
blockquote>
Выберите n'th запись сверху
SELECT * FROM ( SELECT ID, NAME, ROW_NUMBER() OVER(ORDER BY ID) AS ROW FROM TABLE ) AS TMP WHERE ROW = n
выберите n-ю запись снизу
SELECT * FROM ( SELECT ID, NAME, ROW_NUMBER() OVER(ORDER BY ID DESC) AS ROW FROM TABLE ) AS TMP WHERE ROW = n
Вот быстрое решение вашей путаницы.
SELECT * FROM table ORDER BY `id` DESC LIMIT N, 1
Здесь вы можете получить последнюю строку, заполняя N = 0, второе последним - N = 1, четвертое последнее заполнение N = 3 и так далее на.
Это очень распространенный вопрос в интервью, и это очень простые его аспекты.
Далее Если вы хотите, чтобы сумма, идентификатор или некоторый числовой порядок сортировки, чем у, могли идти для функции CAST в MySQL.
SELECT DISTINCT (`amount`) FROM cart ORDER BY CAST( `amount` AS SIGNED ) DESC LIMIT 4 , 1
Здесь, заполнив N = 4, вы сможете получить пятый последний рекорд наибольшей суммы из таблицы CART. Вы можете поместить свое имя поля и таблицы и придумать решение.
ADD:
LIMIT n,1
Это ограничит результаты одним результатом, начиная с результата n.
select * from
(select * from ordered order by order_id limit 100) x order by
x.order_id desc limit 1;
Сначала выберите топ-100 строк, упорядочив их по возрастанию, а затем выберите последнюю строку, упорядочившись в порядке убывания и предел до 1. Однако это очень дорогостоящий оператор, когда он дважды обращается к данным.
Например, если вы хотите выбрать каждую 10-ю строку в MSSQL, вы можете использовать:
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY ColumnName1 ASC) AS rownumber, ColumnName1, ColumnName2
FROM TableName
) AS foo
WHERE rownumber % 10 = 0
Просто возьмите MOD и измените номер 10 на любой номер, который вы хотите.
Я не уверен ни в одном из остальных, но я знаю, что SQLite и MySQL не имеют никакого упорядочения строк по умолчанию. В этих двух диалектах, по крайней мере, следующий фрагмент захватывает 15-ю запись из таблицы, сортируя по дате / времени, когда она была добавлена:
SELECT * FROM the_table ORDER BY added DESC LIMIT 1,15
(конечно, вам нужно будет добавить DATETIME и установите дату / время, в которое была добавлена запись ...)
SELECT
top 1 *
FROM
table_name
WHERE
column_name IN (
SELECT
top N column_name
FROM
TABLE
ORDER BY
column_name
)
ORDER BY
column_name DESC
Я написал этот запрос для поиска N-й строки. Пример с этим запросом будет
SELECT
top 1 *
FROM
Employee
WHERE
emp_id IN (
SELECT
top 7 emp_id
FROM
Employee
ORDER BY
emp_id
)
ORDER BY
emp_id DESC
В Sybase SQL Anywhere:
SELECT TOP 1 START AT n * from table ORDER BY whatever
Не забывайте ORDER BY или это бессмысленно.
Вот общая версия sproc, которую я недавно написал для Oracle, которая позволяет динамически подкачки / сортировка - HTH
-- p_LowerBound = first row # in the returned set; if second page of 10 rows,
-- this would be 11 (-1 for unbounded/not set)
-- p_UpperBound = last row # in the returned set; if second page of 10 rows,
-- this would be 20 (-1 for unbounded/not set)
OPEN o_Cursor FOR
SELECT * FROM (
SELECT
Column1,
Column2
rownum AS rn
FROM
(
SELECT
tbl.Column1,
tbl.column2
FROM MyTable tbl
WHERE
tbl.Column1 = p_PKParam OR
tbl.Column1 = -1
ORDER BY
DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 1, Column1, 'X'),'X'),
DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 1, Column1, 'X'),'X') DESC,
DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate),
DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate) DESC
))
WHERE
(rn >= p_lowerBound OR p_lowerBound = -1) AND
(rn <= p_upperBound OR p_upperBound = -1);
Проверьте его на SQL Server:
Select top 10 * From emp
EXCEPT
Select top 9 * From emp
Это даст вам 10-ю строку таблицы emp!
В Oracle 12c вы можете использовать опцию OFFSET..FETCH..ROWS
с ORDER BY
Например, чтобы получить 3-ю запись сверху:
SELECT *
FROM sometable
ORDER BY column_name
OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY;
LIMIT n, 1 не работает в MS SQL Server. Я думаю, что это просто единственная основная база данных, которая не поддерживает этот синтаксис. Справедливости ради, он не является частью стандарта SQL, хотя он так широко поддерживается, что он должен быть. Во всем, кроме SQL Server LIMIT, отлично работает. Для SQL-сервера я не смог найти элегантное решение.
T-SQL - выбор N'th RecordNumber из таблицы
select * from
(select row_number() over (order by Rand() desc) as Rno,* from TableName) T where T.Rno = RecordNumber
Where RecordNumber --> Record Number to Select
TableName --> To be Replaced with your Table Name
. для выбора 5-й записи из таблицы Employee, ваш запрос должен быть
select * from
(select row_number() over (order by Rand() desc) as Rno,* from Employee) T where T.Rno = 5
Oracle:
select * from (select foo from bar order by foo) where ROWNUM = x
невероятно, что вы можете найти механизм SQL, выполняющий этот ...
WITH sentence AS
(SELECT
stuff,
row = ROW_NUMBER() OVER (ORDER BY Id)
FROM
SentenceType
)
SELECT
sen.stuff
FROM sentence sen
WHERE sen.row = (ABS(CHECKSUM(NEWID())) % 100) + 1
Так я буду делать это в DB2 SQL, я считаю, что RRN (относительный номер записи) хранится в таблице по O / S;
SELECT * FROM (
SELECT RRN(FOO) AS RRN, FOO.*
FROM FOO
ORDER BY RRN(FOO)) BAR
WHERE BAR.RRN = recordnumber
Ничего особенного, никаких специальных функций, если вы используете Caché, как я ...
SELECT TOP 1 * FROM (
SELECT TOP n * FROM <table>
ORDER BY ID Desc
)
ORDER BY ID ASC
Учитывая, что у вас есть столбец идентификатора или столбец datestamp, которому вы можете доверять.
Для SQL-сервера следующее возвращает первую строку из таблицы.
declare @rowNumber int = 1;
select TOP(@rowNumber) * from [dbo].[someTable];
EXCEPT
select TOP(@rowNumber - 1) * from [dbo].[someTable];
Вы можете прокручивать значения примерно так:
WHILE @constVar > 0
BEGIN
declare @rowNumber int = @consVar;
select TOP(@rowNumber) * from [dbo].[someTable];
EXCEPT
select TOP(@rowNumber - 1) * from [dbo].[someTable];
SET @constVar = @constVar - 1;
END;
Я подозреваю, что это дико неэффективно, но довольно простой подход, который работал на небольшом наборе данных, в котором я его пробовал.
select top 1 field
from table
where field in (select top 5 field from table order by field asc)
order by field desc
Это получило бы 5-й элемент, изменив второй верхний номер для получения другого n-го элемента
SQL-сервера (я думаю), но должен работать над более старыми версиями, которые не поддерживают ROW_NUMBER ().
В отличие от некоторых ответов, стандарт SQL не умалчивает об этом предмете.
Начиная с SQL: 2003, вы могли использовать «функции окна» для пропуска строк и ограничения наборов результатов.
И в SQL: 2008 был добавлен несколько более простой подход, используя
OFFSET skip ROWS
FETCH FIRST n ROWS ONLY
Лично я не думаю, что добавление SQL: 2008 было действительно необходимо, поэтому, если Я был ISO, я бы сохранил его из уже довольно большого стандарта.
Для SQL Server общий путь по номеру строки таков: SET ROWCOUNT @row - @ row = номер строки, с которой вы хотите работать.
Например:
set rowcount 20 - устанавливает строку до 20-й строки
выберите мясо, сыр из dbo.sandwich - выберите столбцы из таблицы в 20-й строке
set rowcount 0 - устанавливает rowcount обратно во все строки
Это вернет информацию 20-й строки. Обязательно добавьте строку 0 после.
Я знаю noobish, но я SQL noob, и я использовал его так, что я могу сказать?
1 небольшое изменение: n-1 вместо n.
select *
from thetable
limit n-1, 1
Мне кажется, что для того, чтобы быть эффективным, вам нужно: 1) создать случайное число от 0 до единицы меньше, чем количество записей в базе данных, и 2) иметь возможность выбирать строку в этой позиции. К сожалению, разные базы данных имеют разные генераторы случайных чисел и различные способы выбора строки в позиции в наборе результатов - обычно вы указываете, сколько строк нужно пропустить и сколько строк вы хотите, но для разных баз данных это делается по-разному. Вот что работает для меня в SQLite:
select *
from Table
limit abs(random()) % (select count(*) from Words), 1;
Это зависит от возможности использования подзапроса в предложении limit (который в SQLite является LIMIT & lt; recs для пропуска & gt;, & lt; recs взять & gt;) Выбор количества записей в таблице должен быть особенно эффективным, являясь частью метаданных базы данных, но это зависит от реализации базы данных. Кроме того, я не знаю, будет ли запрос фактически создавать набор результатов до получения N-й записи, но я надеюсь, что это не понадобится. Обратите внимание, что я не указываю предложение «order by». Возможно, лучше «упорядочить» что-то вроде первичного ключа, который будет иметь индекс - получение N-й записи из индекса может быть более быстрым, если база данных не сможет получить N-й запись из самой базы данных, не создавая набор результатов .
WHERE rownumber = n
для получения только n-й строки? – Steve Bennett 12 September 2017 в 07:14