ordered SQL选择columnwise distinct但返回所有列

时间:2010-01-12 20:35:29

标签: sql group-by distinct sql-order-by

我有一个我无法解决的SQL Distinct难题(或者至少不是非常优雅的方式)。

我有两个表(尝试忽略示例的简单性)。我正在使用MSSQL 2008,如果这有很大的不同。

表:类别

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

表:下载

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

我在Category表中有几个类别,下载表中可能有很多下载URL。我有兴趣从下载表中为每个类别使用createdate(或前5个,如果可能的话)选择最新的下载URL。

目前我正在做以下事情,但这不是很好,而且很难成为正确的方法。

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

我们非常感谢任何建议。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 ...

如果有更有效的方法可以完成,请告诉我。

谢谢,