好的,这是交易,我有一个stats表,其中有不同的类型,我只想选择一行,如果它有一个前一个(不是直接上一个)行,它有一些匹配的数据(哈希)并且是唯一的基于另一个列值。
在以下示例中,我们只需要获取SALE行
这个例子应该有所帮助:
id link_id member_id stat_type hash
----------------------------------------------
108 41 82 SALE fffff
107 41 82 CLICK fffff
106 41 82 CLICK eeeee
105 41 67 SALE ddddd
104 41 67 CLICK ddddd
103 41 35 SALE ccccc
102 41 35 CLICK bbbbb
101 41 35 CLICK aaaaa
我想要回到这里的唯一一行是member_id = 67,因为该成员之前唯一的CLICK to link_id 41具有相同的哈希值。成员82和35没有被选中,因为他们都有一个先前点击link_id 41与不匹配的哈希值。
查询结果应为:
id link_id member_id stat_type hash
----------------------------------------------
105 41 67 SALE ddddd
TIA
答案 0 :(得分:1)
如果我已正确理解您的问题,那么您首先需要按link_id
和member_id
对表进行分组,对那些仅包含一个不同hash
的组进行过滤,以及然后将结果返回到您的表中以获取所有匹配的SALE
记录:
SELECT * FROM my_table NATURAL JOIN (
SELECT link_id, member_id
FROM my_table
GROUP BY link_id, member_id
HAVING COUNT(DISTINCT hash) = 1
) t WHERE stat_type = 'SALE'
在sqlfiddle上查看。
答案 1 :(得分:0)
获得此结果的一种方法是使用反连接模式。
SELECT r.*
FROM mytable r
LEFT
JOIN ( SELECT t.member_id
, t.link_id
, t.hash
FROM mytable t
GROUP
BY t.member_id
, t.link_id
, t.hash
) s
ON s.member_id = r.member_id
AND s.link_id = r.link_id
AND NOT (s.hash = r.hash)
WHERE r.stat_type = 'SALE'
AND s.member_id IS NULL
作为s
别名的内联视图(派生表)获取每个member_id和link_id的所有不同哈希值。它保留在表中所有具有stat_type='SALE'
的行,具有匹配的member_id和link_id,以及不匹配的哈希值。
“技巧”是s.member_id IS NULL
谓词。找到匹配的任何行(即不匹配的HASH将为s.member_id设置非空值。只有没有匹配的行才会返回NULL(由于LEFT JOIN)。