【问题标题】:filter several data in several date mysql过滤几个日期mysql中的几个数据
【发布时间】:2019-12-29 06:48:18
【问题描述】:

所以我想过滤我的买家数据谁在 2019 年 1、2、3 月(1 月至 3 月)进行交易谁也在 2017 年 4、5、6 月(4 月至 6 月)进行交易,所以如果买家在 2017 年 4 月之前进行交易,买家没有出现在列表中,我已经尝试了我的语法,但我不知道为什么结果这么多,这是我的语法

SELECT DISTINCT
    d1.buyer_id
FROM data_2019 d1 
WHERE
    MONTH (d1.tgl) IN (1, 2, 3) AND
    NOT EXISTS (SELECT 1 FROM data_2017 d2
                WHERE d2.buyer_id = d1.buyer_id AND d2.tgl < '2017-04-01')
GROUP BY
    buyer_id;

你能告诉我哪里错了吗?

【问题讨论】:

    标签: mysql-workbench


    【解决方案1】:

    我怀疑除了 Tim Biegeleisen 所指出的之外,还有另外两个问题。

    首先,data_2019 中每个买家的每次销售都将导致data_2017 中的测试。我建议从所有买家的表中查询,在data_2019 上使用EXISTS() 子句。这也应该消除对DISTINCT 子句的需要。

    其次,随着时间的推移,将数据按年份划分到不同的表中将是一件令人头疼的事情。为什么不将它们全部放在一个表中?

    因此:

    SELECT 
        b.buyer_id
    FROM buyer b
    WHERE
        EXISTS (SELECT 1 FROM data_all d
                WHERE d.buyer_id = b.buyer_id AND
                      d.tgl >= '2019-01-01' AND d.tgl < '2019-04-01') AND
        EXISTS (SELECT 1 FROM data_all d
                WHERE d.buyer_id = b.buyer_id AND
                      d.tgl >= '2017-04-01' AND d.tgl < '2017-07-01') AND
        NOT EXISTS (SELECT 1 FROM data_all d
                    WHERE d.buyer_id = b.buyer_id AND
                          d.tgl >= '2017-01-01' AND d.tgl < '2017-04-01');
    

    此时,如果您想将“不早于 2017 年 4 月”条款扩展到所有年份,您只需删除 d.tgl &gt;= '2017-01-01' 条款,否则您每年可能需要许多 NOT EXISTS 类。

    【讨论】:

      【解决方案2】:

      我会用 two EXISTS 子句来表达这一点:

      SELECT DISTINCT
          d1.buyer_id
      FROM data_2019 d1
      WHERE
          d1.tgl >= '2019-01-01' AND d1.tgl < '2019-04-01' AND
          EXISTS (SELECT 1 FROM data_2017 d2
                  WHERE d2.buyer_id = d1.buyer_id AND
                        d2.tgl >= '2017-04-01' AND d2.tgl < '2017-07-01') AND
          NOT EXISTS (SELECT 1 FROM data_2017 d2
                      WHERE d2.buyer_id = d1.buyer_id AND d2.tgl < '2017-04-01');
      

      第一个 EXISTS 子句断言第一个查询 2019 年买家在 2017 年 4 月至 6 月(含)之间也是活跃的。第二个 EXISTS 子句确保同一买家在 2017 年第一季度也没有活动2017.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-05
        • 2016-12-15
        • 1970-01-01
        • 2019-02-27
        • 1970-01-01
        • 2014-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多