mysql查询每个分类下3条数据 - mysql每组前几名




如何选择SQL数据库表中的第n行? (19)

SQL SERVER

从顶部选择第n个记录

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

我有兴趣学习从数据库表中选择第n行的一些(理想情况下)数据库不可知的方式。 使用以下数据库的本地功能可以实现这一点也很有趣:

  • SQL Server
  • MySQL的
  • PostgreSQL的
  • SQLite的
  • 神谕

我目前在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 感兴趣Firoz Ansari的博客

更新:请参阅Troels Arvin关于SQL标准的答案Troels,你有没有我们可以引用的链接?


1小改变:n-1而不是n。

select *
from thetable
limit n-1, 1

SQL 2005及更高版本内置此功能。 使用ROW_NUMBER()函数。 对于具有<<上一个和下一个>>样式浏览的网页,这是非常好的:

句法:

SELECT
    *
FROM
    (
        SELECT
            ROW_NUMBER () OVER (ORDER BY MyColumnToOrderBy) AS RowNum,
            *
        FROM
            Table_1
    ) sub
WHERE
    RowNum = 23

T-SQL - 从表中选择第N个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

例如,要从表Employee选择第5条记录,您的查询应该是

select * from
 (select row_number() over (order by Rand() desc) as Rno,* from Employee) T where T.Rno = 5

与某些答案声称相反,SQL标准并没有对此问题保持沉默。

由于SQL:2003,您可以使用“窗口函数”来跳过行并限制结果集。

在SQL:2008中,使用了一个稍微简单的方法
OFFSET skip ROWS FETCH FIRST n ROWS ONLY

就我个人而言,我认为SQL:2008的增加并不是真的需要,所以如果我是ISO,我会把它放在已经相当大的标准中。


令人难以置信的是,你可以找到一个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

例如,如果你想在MSSQL中选择第10行,你可以使用;

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY ColumnName1 ASC) AS rownumber, ColumnName1, ColumnName2
  FROM TableName
) AS foo
WHERE rownumber % 10 = 0

只需拿MOD,并在这里更改数字10任何你想要的数字。


加:

LIMIT n,1

这会将结果限制为从结果n开始的一个结果。


在SQL Server上验证它:

Select top 10 * From emp 
EXCEPT
Select top 9 * From emp

这会给你emp表的第10行!


在Sybase SQL Anywhere中:

SELECT TOP 1 START AT n * from table ORDER BY whatever

不要忘记ORDER BY或者它没有意义。


在标准的可选部分中可以做到这一点,但很多数据库都支持他们自己的做法。

谈论这个和其他事情的一个非常好的网站是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。


对于SQL Server来说,按行号进行操作的通用方法就是这样:SET ROWCOUNT @row - @ row =您想要处理的行号。

例如:

设置rowcount 20 - 将行设置为第20行

从dbo.sandwich选择肉类,奶酪 - 从第20排的餐桌上选择列

设置rowcount 0 - 将rowcount设置回所有行

这将返回第20行的信息。 请务必在之后放入行数0。

我知道noobish,但我是一个SQL noob,我已经使用它,所以我能说什么?


我不知道其余的,但我知道SQLite和MySQL没有任何“默认”行排序。 在这两种方言中,至少,下面的代码片段从thetable中抓取第15个条目,按添加的日期/时间排序:

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

这会得到第五个项目,改变第二个最大的数字来获得不同的第n个项目

SQL服务器(我认为),但应该在不支持ROW_NUMBER()的旧版本上工作。


甲骨文:

select * from (select foo from bar order by foo) where ROWNUM = x

这是您混乱的快速解决方案。

SELECT * FROM table ORDER BY `id` DESC LIMIT N, 1

在这里你可以通过填充N = 0,第二个最后N = 1,第四个最后一个填充N = 3等等来获得最后一行。

这是面试中很常见的问题,这是非常简单的答案。

进一步如果你想要的金额,ID或一些数字排序顺序可能会去CAST函数在MySQL中。

SELECT DISTINCT (`amount`) FROM cart ORDER BY CAST( `amount` AS SIGNED ) DESC LIMIT 4 , 1

在这里通过填充N = 4您将能够从CART表中获得最高金额的第五最后记录。 你可以适合你的领域和表名,并提出解决方案。


这是我最近为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);

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

select * from 
(select * from ordered order by order_id limit 100) x order by 
x.order_id desc limit 1;

首先按升序排序选择前100行,然后按降序排列选择最后一行,并将其限制为1.但是,由于它访问数据两次,因此这是一个非常昂贵的陈述。





postgresql