已排序SQL选择列式不同,但返回所有列

问题描述:

我有一点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

要获取最新的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

我不知道这是否会是那个遇到这样或任何有用的,如果有这样做的更有效的方法但我不得不选择通过创建日期排序的独立列,我设法它通过执行以下操作:

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 ...

如果有更有效的方法来完成,请让我知道。

感谢,