Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как выбрать N-ю строку в таблице базы данных SQL?
Мне интересно изучить некоторые (в идеале) агностические способы выбора n-й строки из таблицы базы данных. Было бы также интересно посмотреть, как это может быть достигнуто с помощью собственных функциональных возможностей следующих баз данных:
- SQL сервер
- MySQL
- PostgreSQL
- SQLite
- Oracle
В настоящее время я делаю что-то вроде следующего в SQL Server 2005, но мне было бы интересно увидеть другие более агностические подходы:
WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000
Кредит за вышеизложенное SQL: веб- блог Фироза Ансари
Update: смотрите ответ Troels Arvin относительно стандарта SQL. Троэльс, у тебя есть какие-нибудь ссылки, которые мы можем привести?
Есть способы сделать это в необязательных частях стандарта, но многие базы данных поддерживают свой собственный способ сделать это.
Действительно хороший сайт, который говорит об этом и других вещах, - это 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
(который я только что скопировал с сайта, связанного выше, так как я никогда не использую эти DBs)
Update: начиная с PostgreSQL 8.4 поддерживаются стандартные оконные функции, поэтому ожидайте, что второй пример будет работать и для PostgreSQL.
Update: SQLite добавлена поддержка оконных функций в версии 3.25.0 на 2018-09-15, поэтому обе формы также работают в SQLite.
Синтаксис LIMIT / OFFSET в PostgreSQL является:
SELECT
*
FROM
mytable
ORDER BY
somefield
LIMIT 1 OFFSET 20;
В этом примере выбирается 21-я строка. OFFSET 20 говорит Postgres пропустить первые 20 записей. Если вы не укажете пункт ORDER BY , нет никакой гарантии, что запись будет возвращена, что редко бывает полезно.
По-видимому, стандарт SQL молчит о предельном вопросе за пределами сумасшедших оконных функций, поэтому все реализуют его по-разному.
Я не уверен ни в одном из rest, но я знаю, что SQLite и MySQL не имеют никакого порядка строк "default". В этих двух диалектах, по крайней мере, следующий фрагмент захватывает 15-ю запись из таблицы the_table, сортируя по дате / времени ее добавления:
SELECT * FROM the_table ORDER BY added DESC LIMIT 1,15
(конечно, вам потребуется добавить поле DATETIME и установить в нем дату/время добавления записи...)
Я подозреваю, что это дико неэффективный, но довольно простой подход, который работал на небольшом наборе данных, который я опробовал.
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, вы можете использовать "window functions" для пропуска строк и ограничения результирующих наборов.
И в SQL:2008 году был добавлен несколько более простой подход, используя
OFFSET skip ROWS
FETCH FIRST n ROWS ONLY
Лично я не думаю, что добавление SQL:2008 действительно было необходимо, поэтому, если бы я был ISO, я бы не стал использовать его в уже довольно большом стандарте.
Когда мы работали в 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
Это не было изящно, и это не было быстро, но это сработало.
Вот быстрое решение вашей путаницы.
SELECT * FROM table ORDER BY `id` DESC LIMIT N, 1
Здесь вы можете получить последнюю строку, заполнив N=0, вторую последнюю-N=1, четвертую последнюю-N=3 и так далее.
Это очень распространенный вопрос во время интервью, и это очень простой ответ на него.
Далее, Если вам нужна сумма, ID или какой-то числовой порядок сортировки, то u может пойти для функции CAST в MySQL.
SELECT DISTINCT (`amount`) FROM cart ORDER BY CAST( `amount` AS SIGNED ) DESC LIMIT 4 , 1
Здесь, заполнив N = 4, вы сможете получить пятую последнюю запись самой большой суммы из таблицы CART. Вы можете подогнать свое поле и название таблицы и придумать решение.
Например, если вы хотите выбрать каждую 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 здесь на любое число, которое вы хотите.
Ограничение n, 1 не работает на сервере MS SQL. Я думаю, что это просто единственная крупная база данных, которая не поддерживает этот синтаксис. Чтобы быть справедливым, это не является частью стандарта SQL, хотя он так широко поддерживается, что это должно быть так. Во всем, кроме SQL сервер LIMIT отлично работает. Для сервера SQL я не смог найти элегантного решения.
Вот общая версия 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);
Но на самом деле, разве все это не просто салонные трюки для хорошего дизайна базы данных в первую очередь? Несколько раз я нуждался в такой функциональности, как эта, это было для простого одного запроса, чтобы сделать быстрый отчет. Для любой реальной работы использование подобных трюков чревато неприятностями. Если требуется выбрать конкретную строку, то просто создайте столбец с последовательным значением и покончите с ним.
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-ю запись из таблицы сотрудника, ваш запрос должен быть
select * from
(select row_number() over (order by Rand() desc) as Rno,* from Employee) T where T.Rno = 5
Для сервера SQL общий способ перехода по номеру строки таков:
SET ROWCOUNT @row --@row = the row number you wish to work on.
например:
set rowcount 20 --sets row to 20th row
select meat, cheese from dbo.sandwich --select columns from table at 20th row
set rowcount 0 --sets rowcount back to all rows
Это вернет информацию о 20-й строке. После этого обязательно введите значение rowcount 0.
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
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