2013-08-13 3 views
1

Я запрашиваю базу данных управления документами, где документы могут иметь много версий. Поэтому мой запрос ниже возвращает один и тот же документ несколько раз из-за версии.Выберите различные строки с максимальным значением другого столбца

SELECT distinct d.DOCNUM, d.DOCNAME,P.FolderName 
    FROM DOCUMENT as d with (nolock) 
    inner join Project_T as pt on d.docnum=pt.item_id 
    inner join Projects p on pt.prj_id=p.prj_id 
    where d.type = 'Personal' and d.owner like '%67360' 

Результаты:

DOCNUM  | DOCNAME  | FOLDERNAME | 
-----------+----------+---------------+ 
123   Article  Jonathan 
123   Article part1 Jonathan 
256   Meeting Notes Jonathan 
5697  Memo   Jonathan 

В идеале Docnum 123 должен возвращать только один раз.

Я присоединился к таблице, в которой содержатся версии для каждого документа, и я выбираю последнюю версию (MAX(h.version), поэтому мой запрос должен возвращать уникальные номера документов в строке.

SELECT distinct d.DOCNUM, h.version, d.DOCNAME,P.FolderName 
    FROM DOCUMENT as d with (nolock) 
    inner join DOCHISTORY as h on h.DOCNUM = d.docnum 
    inner join Project_T as pt on d.docnum=pt.item_id 
    inner join Projects p on pt.prj_id=p.prj_id 
    where d.type = 'Personal' and d.owner like '%67360' 
    and d.SECURITY = 'P' 
    AND h.VERSION = (SELECT MAX(x.version) FROM DOCHISTORY as X 
        where x.docnum = d.DOCNUM) 

, но на этот раз я получить последние версии, однако, где DOCNAME немного отличается, она возвращает тот же Docnum несколько раз. см. ниже docnum 123.

DOCNUM  | Version  | DOCNAME  | FOLDERNAME | 
-----------+--------------+-------------+------------+ 
123   9    Article  Jonathan 
123   9    Article part1 Jonathan 
256   1    Meeting Notes Jonathan 
5697   21    Memo   Jonathan 

Мне нужно отобразить столбец docname в моем отчете. Есть ли способ, чтобы это понравилось?

+0

Какое 'DOCNAME' должно быть показано тогда, в вашем примере выше? Поскольку есть два разных имени, должен быть способ отличить то, что вы действительно хотите –

+0

Я не уверен, что это то, что вы можете исправить, не изменяя способ работы самой таблицы. Как бы то ни было, вы можете редактировать документ (в данном случае название документа) без другой версии создаваемого документа; это означает, что вы можете иметь разные версии документа с той же версией # и не иметь возможности различать их. –

ответ

0

Да, вы можете выбрать первое имя docname. Заменить список выбора поля с этим:

SELECT distinct d.DOCNUM 
,h.version 
,DOCNAME = (SELECT TOP 1 d2.DOCNAME FROM DOCUMENT d2, DOCHISTORY h2 
WHERE d2.DOCNUM = d.DOCNUM and h2.DOCNUM = d.docnum) 
,P.FolderName 

.... (остальная часть кода)

В выводе выше, документ 123 версия 9 должна появиться в статье.

0

То, что вы пытаетесь сделать, намного проще с помощью оконных функций. Вот один из способов:

select DOCNUM, version, DOCNAME, FolderName 
from (SELECT d.DOCNUM, h.version, d.DOCNAME, P.FolderName, 
      max(h.version) over (partition by d.docnum) as maxversion 
     FROM DOCUMENT d with (nolock) 
      inner join DOCHISTORY as h on h.DOCNUM = d.docnum 
      inner join Project_T as pt on d.docnum=pt.item_id 
      inner join Projects p on pt.prj_id=p.prj_id 
    where d.type = 'Personal' and d.owner like '%67360' and d.SECURITY = 'P' 
    ) d 
where version = maxversion; 

Выражение max(h.version) over (partition by d.docnum) представляет собой конструкцию, называется функцией окна (или аналитическая функция в некоторых базах данных). То, что делает, - это возврат максимального значения h.version для каждого значения d.docnum (на основании предложения partition by). Это стандартный SQL ANSI, и большинство баз данных поддерживают эту функциональность.

Возможно, ваша версия не работает, потому что подзапрос, который вычисляет максимальное значение, не использует те же критерии фильтрации, что и внешний запрос.

+0

Спасибо всем. Гордон, я боюсь, что это не сработало для меня. Все равно возвращает один и тот же номер документа несколько раз. – Jasmine

+0

Мартин, мне нужно имя docname для последней версии. Спасибо – Jasmine

+0

@ Жасмин. , , Если этот запрос возвращает одно и то же имя «docname» несколько раз, то это потому, что версия одинакова для всех из них. –