0

我有一张这样的桌子:

id |    action       |  user_id
1       'test'          'person1'
2       'entered'       'person2'
3       'KEYPHRASE1'    'person1'
4       'entered'       'person1'

我需要进行选择并返回“输入”操作的 user_id。但是,我只需要在最后一次出现以下任何一个短语后才执行“输入”操作:“KEYPHRASE1”、“KEYPHRASE2”、“KEYPHRASE3”、“KEYPHRASE4”、“KEYPHRASE5”和“KEYPHRASE6”。如果在这些 KEYPHRASE 中的任何一个最后出现之后没有发生“输入”操作,则返回 null。

(因此,在此示例中,查询应返回“person1”而不是“person2”)

4

2 回答 2

1

这似乎是where子句解决方案中的相关子查询:

select user_id
from t
where t.action = 'entered' and
      exists (select 1
              from t t2
              where t2.id < t1.id and
                    t2.user_id = t1.user_id and
                    t2.action in ('KEYPHRASE1', 'KEYPHRASE2', 'KEYPHRASE3', 'KEYPHRASE4', 'KEYPHRASE5', 'KEYPHRASE6')

以上检查操作是否在最后一个操作之后。可以通过聚合来回答书面问题(在最后一个问题之后):

select user_id
from t
group by user_id
having (max(case when t.action = 'Entered' then id end) >
        max(case when t2.action in ('KEYPHRASE1', 'KEYPHRASE2', 'KEYPHRASE3', 'KEYPHRASE4', 'KEYPHRASE5', 'KEYPHRASE6') then id
           end)
       )
于 2012-12-12T14:56:14.203 回答
0

你可以这样做:

select user_id
from MyTble
where action = 'entered'
  and id > (select MAX(id) from MyTble where action like 'KEYPHRASE%')
于 2012-12-12T16:29:54.663 回答