簡體   English   中英

SQL SERVER-選擇不同的隨機行數

[英]SQL SERVER - select distinct random number of rows

我在下面的查詢中選擇了100個隨機行。 但是,我還需要選擇唯一的名稱。 我嘗試使用SELECT DISTINCT u.name並也使用GROUP BY u.name但無法正常工作。

SELECT TOP (100) c.id, u.id u.name, b.sector, u.default
FROM cads AS c 
INNER JOIN users AS u ON c.cad = u.id 
INNER JOIN business AS b ON u.id = b.cad
WHERE (c.[public] = 'True') AND (c.valid = 'True') 
        AND (u.default = '$curr') 
        AND (c.expires IS NULL OR c.expires >= GETDATE()) 
ORDER BY NEWID() 

非常感謝

您可以通過使用ROW_NUMBER()來做到這一點:

;With Arbitrary AS (
SELECT c.id, u.id u.name, b.sector, u.default,
    ROW_NUMBER() OVER (PARTITION BY u.name ORDER BY newid()) as rn
FROM cads AS c 
INNER JOIN users AS u ON c.cad = u.id 
INNER JOIN business AS b ON u.id = b.cad
WHERE (c.[public] = 'True') AND (c.valid = 'True') 
        AND (u.default = '$curr') 
        AND (c.expires IS NULL OR c.expires >= GETDATE()) 
)
select top 100 * from Arbitrary ORDER BY newid()

(您確實需要兩個ORDER BY子句,因為不能保證CTE中的內部子句實際上會影響TOP運算符正在考慮的行的順序)

也許

SELECT TOP (100) min(c.id), u.id, u.name, min(b.sector), min(u.default)
FROM cads AS c 
INNER JOIN users AS u ON c.cad = u.id 
INNER JOIN business AS b ON u.id = b.cad
WHERE (c.[public] = 'True') AND (c.valid = 'True') 
        AND (u.default = '$curr') 
        AND (c.expires IS NULL OR c.expires >= GETDATE())
GROUP BY u.id, u.name 
ORDER BY NEWID() 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM