0

私はこの結果セットを持っています:

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()

何か案は?

4

1 に答える 1

1

MAX(a.id)一緒に使うGROUP BY a.categoria

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


アップデート

それぞれのランダムな ID を取得するには、次のようにランキング関数categoria使用してランダムな順序を取得できます。 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;

ここで実際にそれを見てください:

このようにして、毎回ランダムなIDが与えられますcategoria


ただし、最初が必要な場合は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;

これにより、各 の最初の ID が得られますcategoria

リレーショナル モデルでは行の順序は重要ではないため、データベースの概念では最初の値に意味はありません。また、毎回同じ順序を返すことが保証されているわけではありません。一貫した順序を得るには、特定の列にする必要があります。ORDER BY

于 2013-05-24T11:04:17.013 に答える