仅一组的最后 6 行

Last 6 rows for only one group

我有 table:

label   added
1-1     2020-11-09 08:22:37.000
x1      2020-11-09 07:22:37.000
x3      2020-11-09 07:25:43.000
x6      2020-11-09 05:42:37.000
x1      2020-11-07 04:22:37.000
1-1     2020-11-09 08:22:37.000
1-1     2020-11-09 08:22:37.000
1-1     2020-11-06 08:22:37.000
1-1     2020-11-03 08:22:37.000
1-1     2020-11-02 08:22:37.000
1-1     2020-11-01 05:22:37.000
1-1     2020-10-09 01:52:37.000

我想select所有记录,但对于标签“1-1”只有最后 6 条最新记录。 这可能与排名功能一起使用:

SQL * FROM (
    SELECT label, added
           , RANK() OVER (PARTITION by label order by added desc) as lastN
    FROM table
) t
WHERE (label = '1-1' AND lastN <= 6)

但我想知道是否可以做不同的事情?也许没有相关子查询?

您当前的排名查询非常理想,但您也可以在此处使用 TOP 和联合:

SELECT * FROM yourTable WHERE label <> '1-1'
UNION ALL
SELECT * FROM (
    SELECT TOP 6 *
    FROM yourTable
    WHERE label = '1-1'
    ORDER BY added DESC
) t;

您可以使用当前的 window 函数,其中 PARTITION BY 也应该被删除,在主查询的 ORDER BY 子句中连同 TOP 6 按顺序在没有子查询的情况下进行查询

SELECT TOP 6 *
  FROM [table]
 WHERE label = '1-1'
 ORDER BY RANK() OVER (ORDER BY added DESC) 

Demo

在这种情况下,ORDER BY 子句中的 label 列也是多余的,因为在 WHERE 条件中被过滤掉了。