【发布时间】:2016-03-12 12:09:39
【问题描述】:
我的桌子看起来像
__ Key type timeStamp flag
1 ) 1 B 2015-06-28 22:19:26 Y
2 ) 1 B 2015-06-28 22:20:22 Y
3 ) 1 C 2015-06-28 22:22:06 N
4 ) 1 A 2015-06-28 22:25:11 N
5 ) 1 B 2015-06-28 22:29:44 Y
6 ) 1 A 2015-06-28 22:33:33 N
7 ) 1 B 2015-06-28 22:35:21 N
8 ) 1 B 2015-06-28 22:39:34 Y
9 ) 1 B 2015-06-28 22:43:53 N
10) 1 A 2015-06-28 22:45:53 N
我需要找出所有类型 A 的 flag='N' 相对于存在类型 B 的 timestampOF(B)<timestampOF(A) 和 Flag(B)='Y' 和 key(A)=key(B)。
注意:如果在 A 之前存在两个 B,则取最大时间戳的 B。(取 ROW[8,9,10] 9 而不是 8)
输出
__ Key type timeStamp flag
4 ) 1 A 2015-06-28 22:25:11 N
6 ) 1 A 2015-06-28 22:33:33 N
我的方法
SELECT *
FROM tab TAB_OUT
WHERE TAB_OUT.TYPE='A'
AND TAB_OUT.FLAG='N'
AND EXISTS(
SELECT *
FROM tab TAB_IN
WHERE TAB_IN.KEY = TAB_OUT.KEY
AND TAB_IN.TYPE='B'
AND TAB_OUT.FLAG='Y'
AND TAB_IN.timestamp<TAB_OUT.timestamp
AND TAB_IN.timestamp = (SELECT MAX(timestamp) from
tab where timestamp< `TAB_OUT.timestamp`)
);
但在此我不能在第三级查询中使用
TAB_OUT.timestamp。有没有其他解决方案可以解决这个问题。在我的查询
note:中,部分不满足我的查询,因为它跳过了 no。 9) 并且满足条件没有。 8)
【问题讨论】:
-
请不要将列命名为
timestamp、type或key- 虽然它会起作用,但这些是 SQL 中的关键字,因此可能会造成混淆。 -
如果您有一个
B, Y行,后面紧跟两个具有相同键的A, N行,会发生什么情况 - 您希望只有第一个A行还是两者都有?