已排序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
任何建议将不胜感激。
答
要获取最新的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
答
我不知道这是否会是那个遇到这样或任何有用的,如果有这样做的更有效的方法但我不得不选择通过创建日期排序的独立列,我设法它通过执行以下操作:
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
...
如果有更有效的方法来完成,请让我知道。
感谢,
显示了一些输入输出...你会得到更快的帮助 – CheeseConQueso 2010-01-12 20:44:24
也,它看起来像你甚至没有使用你的代码类别表...为什么你把它放在这里? – CheeseConQueso 2010-01-12 20:46:03