如何根据特定值和重复项排除行

时间:2017-01-06 00:28:32

标签: mysql

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

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处理数据。

2 个答案:

答案 0 :(得分:1)

正如您现在添加了关于如何排除已删除信息的说明,我建议如下:

YourCell.Image.WidthRequest = DependencyService.Get<IScreen>().GetScreenWidth * 0.1; 

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

如果没有这个可能会有所帮助:

查询1

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

<强> Results

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

查询2

|     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 |

<强> Results

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

答案 1 :(得分:0)

很难判断给定的样本数据是什么。

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

请参阅以下示例,在SQL

的突出显示部分仍返回一行

enter image description here

但是如果你在最后运行额外的2行,就没有结果,你需要仔细检查为什么?因为SQL第11行之后没有数据匹配

相关问题