Tsql获取一个类别中的第一个随机产品

时间:2013-05-24 11:03:08

标签: sql sql-server tsql aggregate-functions

我有这个结果集:

select a.id, a.categoria from Articolo a
where novita = 1
order by a.categoria, newid()

id          categoria
----------- -----------
3           4
11          4
1           4
12          5
13          5
4           6

我会从每个不同的类别中获得第一个产品(按随机顺序):

id          categoria
----------- -----------
3           4
12          5
4           6

理想情况类似

select FIRST(a.id), a.categoria from Articolo a
where novita = 1
order by a.categoria, newid()

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

MAX(a.id)GROUP BY a.categoria

一起使用
SELECT MAX(a.id), a.categoria 
from Articolo a
where novita = 1
GROUP BY a.category

<击>


更新

要获取每个categoria的随机ID,您可以使用ranking function ROW_NUMBER() OVER(PARTITION BY categoria)ORDER BY NEWID获取随机排序,如下所示:

WITH CTE
AS
(
  SELECT id, categoria, ROW_NUMBER() OVER(PARTITION BY categoria
                                          ORDER BY NEwID()) AS rn
  FROM Articolo
)
SELECT id, categoria
FROM CTE
WHERE rn = 1;

请在此处查看:

这样,它每次都会为每个categoria提供一个随机ID。


然而,如果您想要第一个,可以使用排名函数ORDER BY(SELECT 1)中的ROW_NUMBER()

WITH CTE
AS
(
  SELECT id, categoria, ROW_NUMBER() OVER(PARTITION BY categoria
                                          ORDER BY (select 1)) AS rn
  FROM Articolo
)
SELECT id, categoria
FROM CTE
WHERE rn = 1;

这将为您提供每个categoria的第一个ID。

请注意:数据库概念中没有 first 值的含义,因为在关系模型中,行顺序并不重要。并且 无法保证 每次都返回相同的订单,您 ORDER BY特定列以获得一致的排序。< / p>