Использование Microsoft SQL Server Express Edition (64-разрядная версия) 10.0.550.0
Я пытаюсь извлечь данные с сервера Autodesk Vault. SQL, используемый для получения необходимых данных, слишком сложен для моего текущего уровня знаний, поэтому я пытаюсь сложить головоломку, используя кусочки из Google и StackOverflow в качестве кусочков. Используя отличный ответ, я смог перенести вертикальные данные в удобный горизонтальный формат.
В базе данных Autodesk Vault хранится информация о чертежах САПР (среди прочего). Основная вертикальная таблица dbo.Property
содержит информацию обо всех различных версиях каждого чертежа САПР. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я получаю слишком много данных. Мне просто нужны данные из последней версии каждого чертежа САПР.
Вот мой SQL до сих пор
select
CreateDate,
EntityID,
PartNumber,
CategoryName,
[Subject],
Title
from
(
select
EntityID,
CreateDate,
[53] as PartNumber,
[28] as CategoryName,
[42] as [Subject],
[43] as Title
from
(
select
p.Value,
p.PropertyDefID,
p.EntityID,
e.CreateDate
from dbo.Property as p
inner join dbo.Entity as e on p.EntityID = e.EntityId
where p.PropertyDefID in(28, 42, 43, 53)
and e.EntityClassID = 8
) t1
pivot
(
max(Value)
for PropertyDefID in([28], [42], [43], [53])
) t2
) t3
where PartNumber is not null
and PartNumber != ''
and CategoryName = 'Drawing'
-- (1) additional condition
order by PartNumber, CreateDate desc
Где dbo.Property.Value
относится к типу данных sql_variant
. Приведенный выше запрос приводит к набору данных, подобному этому:
CreateDate | EntityID | PartNumber | CategoryName | Subject | Title
---------------------------------------------------------------------
2016-01-01 | 59046 | 10001 | Drawing | Xxxxx | Yyyyy
2016-05-01 | 60137 | 10001 | Drawing | Xxxxx | Yyyyy
2016-08-01 | 62518 | 10001 | Drawing | Xxxx | Yyyyyy
2016-12-16 | 63007 | 10001 | Drawing | Xxxxxx | Yyyyyy
2016-01-01 | 45776 | 10002 | Drawing | Zzzzz | NULL
2016-11-01 | 65011 | 10002 | Drawing | Zzzzzz | NULL
...
(about 23000 rows)
У меня проблема в том, что я получаю все версии для каждого рисунка. В приведенном выше примере мне нужна только последняя версия для PartNumber=10001
от «2016-12-16» и т. д.
Я также просмотрел этот ответ о том, как сгруппируйте и выберите строки, в которых один из столбцов имеет максимальное значение, но я просто не могу понять, как их объединить. Я попытался добавить следующий фрагмент в закомментированную строку в приведенном выше запросе, но он терпит неудачу на многих разных уровнях.
and (PartNumber, CreateDate) in
(
select PartNumber, max(CreateDate)
from t3
group by PartNumber
)
Причина, по которой я помечаю этот вопрос как «поворот», хотя поворот уже сделан, заключается в том, что я подозреваю, что поворот вызывает у меня проблемы. Я просто еще не смог окунуться в этот поворотный материал, и мне серьезно не хватает навыков оптимизации SQL. Может быть, фильтрацию следует делать на внутреннем уровне?