组合没有唯一标识符的行

时间:2014-06-02 19:33:08

标签: sql sql-server-2012

当行不包含其他行引用的唯一标识符时,我可以使用一些帮助来开发一种组合数据行的方法。有一个pri_key,但尾随的行永远不会引用该键。

免责声明:我无法控制表格的设计。这是一个查询,我正在运行我们购买并生产的软件数据库。

这是一个类似于我正在查看的数据的示例:

pri_key   |   personID   |   Type   |   reference   |   details   |   date_time
101              1            A        Renewal #001   Trans # 001   2014-04-01 09:30:00
102              1            B        Modify  #001   Expires 30d   2014-04-01 09:30:00
104              1            A        Renewal #001   Trans # 002   2014-04-01 09:30:00
105              1            B        Modify  #001   Expires 60d   2014-04-01 09:30:00
108              2            A        Renewal #020   Trans # 003   2014-04-21 14:30:00
109              2            B        Modify  #020   Expires 45d   2014-04-21 14:30:00
111              3            A        Renewal #140   Trans # 004   2014-05-11 12:30:00
112              3            B        Modify  #140   Expires 90d   2014-05-11 12:30:00

还有数百行,有些personID有4行,有些有2行。在A类行后面总是有一个B类行,这就是我所追求的。根据我的推测,对于B型行,pri_key总是增加1,但是pri_keys之间存在间隙,如样本中所示。 A和B也总是具有完全相同的时间戳。

使用上面的示例,这是我想看到的内容:

pri_key   |   personID   |   Type   |   reference   |   details   |   date_time         |   Modify    |   Expires
101              1            A        Renewal #001   Trans # 001   2014-04-01 09:30:00  Modify  #001    Expires 30d
104              1            A        Renewal #001   Trans # 002   2014-04-01 09:30:00  Modify  #001    Expires 60d
108              2            A        Renewal #020   Trans # 003   2014-04-21 14:30:00  Modify  #020    Expires 45d
111              3            A        Renewal #140   Trans # 004   2014-05-11 12:30:00  Modify  #140    Expires 90d

基本上,我需要来自B类型details的“过期”信息以汇总到A类型的行。但是,我遇到了有2组行的peronID。当我在JOIN语句中进行各种尝试时,我最终得到了一个加倍Expires列:

pri_key   |   personID   |   Type   |   reference   |   details   |   date_time         |   Modify    |   Expires
101              1            A        Renewal #001   Trans # 001   2014-04-01 09:30:00  Modify  #001    Expires 60d
104              1            A        Renewal #001   Trans # 002   2014-04-01 09:30:00  Modify  #001    Expires 60d
108              2            A        Renewal #020   Trans # 003   2014-04-21 14:30:00  Modify  #020    Expires 45d
111              3            A        Renewal #140   Trans # 004   2014-05-11 12:30:00  Modify  #140    Expires 90d

我目前正在考虑我需要找到一种方法来使用pri_key +1增量对我有利,但我不确定这是最好的方法,甚至不知道如何正确处理它。有人可以提出任何建议吗?我知道我在这里写的东西对我和其他人都没有意义,所以如果我能澄清,请告诉我。谢谢!

插入示例数据的

I've created a SQL Fiddle如果任何人都更容易引用它。

2 个答案:

答案 0 :(得分:1)

评论的“和”条款不一定是必要的(如果你所描述的是正确的)并且可能会使事情变慢,但你可以将它们包括在内以保证安全。如果没有评论的内容,这可能比基于类型/人员ID的比较快得多,您不必担心索引这些列:

select a.*, b.reference as 'Modify', b.details as 'Expires'
from my_table a
join my_table b on a.pri_key = b.pri_key - 1
  -- and a.date_time = b.date_time
  -- and a.personid = b.personid
  -- and b.type = 'B'
where a.type = 'A'

您真的需要“修改”栏吗?

答案 1 :(得分:0)

这应该有效。

SELECT 
  a1.pri_key, a1.personID, a1.Type, a1.reference, a1.details, a1.date_time, a2.reference as Modify, a2.details AS Expires  
FROM Activity AS a1 
LEFT JOIN activity as a2 on 
  a1.personid = a2.personid and 
  a1.pri_key+1 = a2.pri_key
WHERE  
  a1.type='A' and a2.type='B'

您需要为您的联接命名,然后使用该名称来检索您想要的信息。

这是SQLFiddle