2008-12-10 72 views
1

問題:座標緯度/ LNGS的表。兩行可能具有相同的座標。我們需要一個返回一組具有唯一座標的行的查詢(在返回集內)。請注意,distinct不可用,因爲我需要返回按定義區分的id列。這類作品(@maxcount是我們所需要的行數,intid是一個獨特的INT ID列):SQL服務器蘭特()聚合

select top (@maxcount) max(intid) 
from Documents d 
group by d.geoLng, d.geoLat 

它總是會返回同一行對於給定的不幸的座標,這是一種恥辱位爲我的用途。如果我們有一個rand()聚集,我們可以用它代替max() ......注意,你不能與newid()創建的GUID使用max()

任何想法? (有一些更多的背景在這裏,如果你有興趣:http://www.itu.dk/~friism/blog/?p=121

UPDATE:完整的解決方案here

回答

2

你也許能夠使用CTE爲這個跨越緯度和長ROW_NUMBER函數,然後使用蘭特()針對。類似於:

WITH cte AS 
(
    SELECT 
     intID, 
     ROW_NUMBER() OVER 
      (
       PARTITION BY geoLat, geoLng 
       ORDER BY NEWID() 
      ) AS row_num, 
     COUNT(intID) OVER (PARTITION BY geoLat, geoLng) AS TotalCount 
    FROM 
     dbo.Documents 
) 
SELECT TOP (@maxcount) 
    intID, RAND(intID) 
FROM 
    cte 
WHERE 
    row_num = 1 + FLOOR(RAND() * TotalCount) 

這將始終返回第一組lat和lngs,並且我無法使順序隨機。也許有人可以繼續這種方法。它會給你一個隨機的行內匹配的拉特和lng組合。

如果我有更多的時間後,我會盡量避開這一最後的障礙。

+0

如果用`newid()`代替`intid`的順序,這實際上是有效的。 `partition'似乎強加了一些順序(這很有道理),所以必須重新調整外部查詢中的結果。沒有這種洗牌,所有的行都選擇到了極端的南方:-)。 – friism 2008-12-10 19:42:08

0

你從哪兒弄來那DISTINCT僅適用於一列的想法?無論如何,你也可以使用GROUP BY子句。

+0

我第二個,所有專欄的獨特作品! ALl columnst必須是唯一的。 – 2008-12-10 00:49:04

+0

你絕對正確,我已經迴避了這個問題。但問題仍然存在。 – friism 2008-12-10 10:54:14

1

這不適合你嗎?

select top (@maxcount) * 
from 
(
    select max(intid) as id from Documents d group by d.geoLng, d.geoLat 
) t 
order by newid()