繁体   English   中英

如何根据某些值和重复项排除行

[英]How to exclude rows based on certain values and duplicates

我们具有与订阅事件相关的数据- createupdatedelete等。我希望能够基于某些值查询此数据,以便根据记录的事件确定给定用户在给定日期是否处于活动状态。 我有下表:( SQL在这里

CREATE TABLE events (
  eid varchar(45) NOT NULL,
  cid varchar(45) DEFAULT NULL,
  sid varchar(45) DEFAULT NULL,
  event_type varchar(45) DEFAULT NULL,
  period_start datetime DEFAULT NULL,
  period_end datetime DEFAULT NULL,
  date date DEFAULT NULL,
  datetime datetime DEFAULT NULL,
  PRIMARY KEY (eid)
);

带有以下示例数据:

INSERT INTO events
  (eid, cid, sid, event_type, period_start, period_end, date, datetime)
VALUES
  ('event_1', 'customer_1', 'subscription_456', 'created', '2016-03-11 17:38:50', '2016-09-11 18:38:50', '2016-03-11', '2016-03-11 17:38:51');
  ('event_2', 'customer_1', 'subscription_456', 'updated', '2016-09-11 18:38:50', '2017-03-11 17:38:50', '2016-09-11', '2016-09-11 18:46:04'),
  ('event_3', 'customer_1', 'subscription_456', 'deleted', '2016-09-11 18:38:50', '2017-03-11 17:38:50', '2016-09-11', '2016-09-11 22:39:43'),

我正在寻找一个查询,我可以在其中输入任何日期,以根据period_startperiod_endevent_type查看此用户在这段时间内是否处于活动状态。

基本上,如果存在具有event_type = 'deleted' ,则它应排除该行以及其他所有具有相同sidperiod_startperiod_end值的行。 我努力了:

SELECT e.* FROM events e
JOIN (SELECT sid, event_type, period_start, period_end
    FROM events) e2
    ON
        (e2.sid = e.sid AND e2.event_type = "deleted"
        AND e2.period_start = e.period_start
        AND e2.period_end = e.period_end)
    WHERE
        (e.event_type = 'created' OR e.event_type = 'updated')
        AND date(e.period_start) <= '2016-04-01'
        AND date(e.period_end) >= '2016-04-01';

它应返回created事件(但不返回任何内容),而使用日期2016-09-012017-01-01则不返回任何内容。 我不确定接下来要尝试什么。 我真的很希望能够在查询中完成此任务,而不必在PHP或JS中处理数据。

现在,您已经添加了有关如何删除已删除信息的描述,我建议以下内容:

SELECT  e.eid, e.cid, e.sid, e.event_type, e.period_start, e.period_end, e2.eid, e2.event_type
FROM events e
left join events e2
       on e.sid = e2.sid and e.event_type <> 'deleted' and e2.event_type = 'deleted'
       AND e.period_start = e2.period_start AND e.period_end = e2.period_end
WHERE e.event_type <> 'deleted'
AND e2.eid IS NULL
AND  '2016-04-01' between e.period_start and e.period_end

先前的答案:我真的不知道您想要什么,如果您列出一组参数然后列出这些参数的预期结果,也许会有所帮助?

在这种情况下,这可能会有所帮助:

查询1

SELECT e.* 
FROM events e
WHERE '2016-04-01' between e.period_start and e.period_end

结果

|     eid |        cid |              sid | event_type |            period_start |                  period_end |                    date |                datetime |
|---------|------------|------------------|------------|-------------------------|-----------------------------|-------------------------|-------------------------|
| event_1 | customer_1 | subscription_456 |    created | March, 11 2016 17:38:50 | September, 11 2016 18:38:50 | March, 11 2016 00:00:00 | March, 11 2016 17:38:51 |

查询2

SELECT  e.eid, e.cid, e.sid, e.event_type, e.period_start, e.period_end, e2.eid, e2.event_type
FROM events e
left join events e2
       on e.sid = e2.sid and e.event_type <> 'deleted' and e2.event_type = 'deleted'
WHERE '2016-04-01' between e.period_start and e.period_end

结果

|     eid |        cid |              sid | event_type |            period_start |                  period_end |     eid | event_type |
|---------|------------|------------------|------------|-------------------------|-----------------------------|---------|------------|
| event_1 | customer_1 | subscription_456 |    created | March, 11 2016 17:38:50 | September, 11 2016 18:38:50 | event_3 |    deleted |

很难说出在给定样本数据下发生了什么。

但是,重要的是调试SQL在哪一行停止返回值:

参见下面的示例,SQL突出显示的部分仍然返回一行

在此处输入图片说明

但是,如果您在末尾再运行两行,将不会有任何结果,您将需要仔细检查原因? 因为没有数据会在SQL第11行之后匹配

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM