当行不包含其他行引用的唯一标识符时,我可以使用一些帮助来开发一种组合数据行的方法。有一个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如果任何人都更容易引用它。
答案 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。