0

好的,这是交易,我有一个统计表,其中有不同的类型,我只想选择一个行,如果它有前一个(不是直接前一个)行,它有一些匹配的数据(散列)并且基于另一个是唯一的列值。

在以下示例中,我们只需要获取 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,因为该成员之前对 link_id 41 的唯一一次 CLICK 具有相同的哈希值。成员 82 和 35 没有被选中,因为他们之前都点击了链接 ID 41,但哈希不匹配。

查询结果应该是:

id    link_id   member_id   stat_type   hash
----------------------------------------------
105   41        67          SALE        ddddd

TIA

4

2 回答 2

1

如果我正确理解了您的问题,那么您首先需要按link_idand对表进行分组member_id,过滤那些仅包含一个 distinct 的组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上查看。

于 2013-10-29T20:38:41.200 回答
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

别名为 as 的内联视图(派生表)s获取每个 member_id 和 link_id 的所有不同哈希值。这将与表中具有stat_type='SALE'匹配的 member_id 和 link_id 以及不匹配的哈希的所有行保持连接。

“技巧”是s.member_id IS NULL谓词。找到匹配的任何行(即不匹配的 HASH 将具有 s.member_id 的非空值。只有没有匹配的行才会返回 NULL(由于 LEFT JOIN)。

于 2013-10-29T21:38:41.297 回答