2016-12-16 18 views
0

使用Microsoft SQL Server速成版(64位)10.0.550.0过滤Autodesk Vault中的垂直数据,获得最新的记录每个绘图

我试图从Autodesk Vault服务器提取数据。涉及到获取所需数据的SQL对于我当前的知识水平来说太高级了,所以我试图用Google和StackOverflow中的一些部分作为拼图来解决难题。使用this excellent answer我能够将垂直数据转换为可管理的水平格式。

Autodesk Vault数据库存储有关CAD绘图(等等)的信息。主垂直表dbo.Property保存有关每个CAD图形的所有不同修订版本的信息。我目前面临的问题是我得到的数据太多。我只想从每张CAD图纸的最新版本中获取数据。

这里是到目前为止

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.Valuesql_variant数据类型的我的SQL。上面的查询导致类似于以下的数据集:

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'等。

我也查看了this answer关于如何分组和选择其中一列具有最大值的行,但我似乎无法弄清楚如何将两者结合起来。我试着在上面的查询中添加下面的代码片段到注释行中,但它在许多不同的层次上失败。

and (PartNumber, CreateDate) in 
(
    select PartNumber, max(CreateDate) 
    from t3 
    group by PartNumber 
) 

的原因,我标记这个问题“转动”,尽管旋转已经完成,是我怀疑什么是透视是造成我的麻烦。我只是还没有能够围绕这个主要的东西包围我的头,我的SQL优化技能严重缺乏。也许过滤应该在内部完成?

+0

'SELECT x。 FROM(你的查询)x JOIN(选择partnumber,MAX(Cre​​ateDate)FROM(你的QUERY HERE)GROUP BY partnumber)y ON y.partnumber = x.partnumber AND y.createdate = x.createdate' – Strawberry

+0

我想你有不使用[Web服务](https://knowledge.autodesk。COM /支持/跳马产品/学习,探索/ CAAS/CloudHelp/cloudhelp/2014/ENU /库/文件/ GUID-F21E7DD6-39E9-473C-84BB-3446BCAFCCC0-htm.html)?从文档:> **直接访问**并严格禁止编辑Vault数据库。 – Maxence

+0

@Maxence不知道这是否是一个很好的理由,但我得到了一个RDP到服务器的MSSQL SMS窗口打开并要求从数据库中提取某个数据集。我不知道有一个API。我试图在网上搜索文档,但我发现它缺乏。有没有REST API?我们需要从简单的Web应用程序访问Vault。 –

回答

0

从@Strawberry提供的评论中汲取灵感,我一直在努力工作和调整,直到我找到似乎有用的东西。我不得不在PIVOT内部使用PIVOT,因为这一切都可行。

编辑:起初我使用了视图,但随后我必须使用只读数据库用户才能更改先决条件。幸运的是,我仍然可以创建临时表。

这是最终结果。

if object_id('tempdb.dbo.#Properties', 'U') is not null 
    drop table #Properties 

create table #Properties 
(
    PartNumber nvarchar(max), 
    [Subject] nvarchar(max), 
    Title  nvarchar(max), 
    CreateDate datetime 
) 

insert into #Properties 
(
    PartNumber, 
    [Subject], 
    Title, 
    CreateDate 
) 
select 
    convert(nvarchar(max), PartNumber), 
    convert(nvarchar(max), [Subject]), 
    convert(nvarchar(max), Title), 
    convert(datetime, CreateDate) 
from 
(
    select 
     EntityID, 
     CreateDate, 
     [53] as PartNumber, 
     [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 (42, 43, 53) 
     and e.EntityClassID = 8 
     and p.EntityID in 
     (
      select 
       max(EntityID) as MaxEntityID 
      from 
      (
       select 
        EntityID, 
        [28] as CategoryName, 
        [53] as PartNumber 
       from 
       (
        select 
         p.Value, 
         p.EntityID, 
         p.PropertyDefID 
        from dbo.Property as p 
        inner join dbo.Entity as e on p.EntityID = e.EntityId 
        where p.PropertyDefID in (28, 53) 
        and e.EntityClassID = 8 -- FileIteration 
       ) as t1 
       pivot 
       (
        max(Value) 
        for PropertyDefID in ([28], [53]) 
       ) as t2 
      ) as t3 
      where CategoryName = 'Drawing' 
      group by PartNumber 
     ) 
    ) as t4 
    pivot 
    (
     max(Value) 
     for PropertyDefID in ([42], [43], [53]) 
    ) as t5 
) as t6 
where PartNumber is not null 
and PartNumber != '' 
order by PartNumber 

select * from #Properties; 
-- search conditions goes here 

我不得不建议join更改为where x in(y)因为联接是出奇的慢(我终止4分钟后查询)。现在得到的数据集(这需要约2秒产生)看起来很有希望:

PartNumber | Subject | Title | CreateDate  | ... 
----------------------------------------------------------------------- 
100000  | Xxxxxx | Yyyyyy | 2015-08-17 09-10 | ... 
100001  | Zzzzzz | NULL | 2015-09-02 15-23 | ... 
... 
(about 8900 rows) 

没有更旧版本的集合。