2010-01-12 88 views
1

我有一點SQL獨特的難題,我無法解決(或至少不是以非常優雅的方式)。已排序SQL選擇列式不同,但返回所有列

我有兩個表(儘量忽略示例的簡單性)。我使用MSSQL 2008,如果這有很大的不同。

表:類別

| categoryId (uniqueidentifier) PK | 
| Name varchar(50)     | 

表:下載

| downloadId (uniqueidentifier) PK | 
| categoryId (uniqueidentifier) FK | 
| url (varchar(max))    | 
| createdate (datetime)   | 

我有幾個類別的分類表,並有可能在下載表格很多下載網址。我有興趣從下載表中選擇使用創建的最新版本(或前5個,如果可能的話)下載每個類別的網址。

目前我正在做以下工作,但這不是很好,也很難成爲正確的方法。

SELECT 
    categoryId, 
    max(convert(BINARY(16),downloadId)) as downloadId, 
    max(createdate) as createdate 
INTO tmp 
FROM Download 
GROUP BY categoryId 
ORDER BY createdate 

SELECT url 
FROM Download 
WHERE downloadId IN 
     (SELECT CONVERT(uniqueidentifier, downloadId) FROM tmp) 

DROP Table tmp 

任何建議將不勝感激。

+0

顯示了一些輸入輸出...你會得到更快的幫助 – CheeseConQueso 2010-01-12 20:44:24

+0

也,它看起來像你甚至沒有使用你的代碼類別表...爲什麼你把它放在這裏? – CheeseConQueso 2010-01-12 20:46:03

回答

2

要獲取最新的5個下載,你應該能夠:

SELECT categoryId, downloadId, createdate, url 
FROM (
    SELECT 
    categoryId, downloadId, createdate, url, 
    ROW_NUMBER() OVER(PARTITION BY categoryId ORDER BY createdate DESC) rownum 
    FROM Download 
) d 
WHERE d.rownum <= 5 
+0

除了拼寫錯誤,這是完美的。謝謝! 我看了一個類似的例子,但認爲ROW_NUMBER沒有在mssql中工作 - 對我很恥辱。 – sjkp 2010-01-12 21:03:58

+0

cytegoryId應該是categoryId,次要的東西很可能不會使用相同的名字。 – sjkp 2010-01-12 21:07:36

+0

謝謝,我糾正了錯字。 – 2010-01-12 21:13:27

0

我不知道這是否會是那個遇到這樣或任何有用的,如果有這樣做的更有效的方法但我不得不選擇通過創建日期排序的獨立列,我設法它通過執行以下操作:

SELECT DISTINCT categoryId, downloadId, url 
FROM ( 
    SELECT 
    categoryId, downloadId, createdate, url, 
    ROW_NUMBER() OVER(PARTITION BY categoryId ORDER BY createdate DESC) rownum 
    FROM Download 
) d 
WHERE d.rownum <= 5 

基本上都添加了DISTINCT和刪除CreateDate ...

如果有更有效的方法來完成,請讓我知道。

感謝,