упорядоченный SQL Выбор по столбцам отличается, но возврат всех столбцов - PullRequest
1 голос
/ 12 января 2010

У меня есть небольшая головоломка SQL Distinct, которую я не могу решить (или, по крайней мере, не очень элегантно).

У меня есть две таблицы (постарайтесь не обращать внимания на простоту примера). Я использую MSSQL 2008, если это имеет большое значение.

Таблица: Категория

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

Таблица: Скачать

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

У меня есть несколько категорий в таблице категорий и потенциально много URL-адресов для загрузки в таблице загрузок. Я заинтересован в выборе новейшей версии с использованием созданной (или топ-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

Любые предложения будут высоко оценены.

Ответы [ 2 ]

2 голосов
/ 12 января 2010

Чтобы получить 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 голосов
/ 16 марта 2010

Я не знаю, будет ли это полезно кому-либо, кто сталкивается с этим, или есть ли более эффективный способ сделать это, но мне пришлось выбрать отдельные столбцы, упорядоченные по дате создания, и мне это удалось, выполнив :

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

Если есть более эффективный способ сделать это, пожалуйста, дайте мне знать.

Спасибо

...