SQL:查找锁定日期的棘手问题

Posted

技术标签:

【中文标题】SQL:查找锁定日期的棘手问题【英文标题】:SQL: tricky question for finding lockout dates 【发布时间】:2018-12-05 18:43:06 【问题描述】:

希望您能提供帮助。我们有一个包含两列 Customer_ID 和 Trip_Date 的表。客户在第一次访问以及在过去 30 天内未收到 15% 折扣优惠的每次访问时均可享受 15% 折扣。如何编写单个 SQL 查询来查找客户获得 15% 折扣的所有日期?

表格是这样的

+-----+-------+----------+
| Customer_ID | date     |
+-----+-------+----------+
|          1  | 01-01-17 |
|          1  | 01-17-17 |
|          1  | 02-04-17 |
|          1  | 03-01-17 |
|          1  | 03-15-17 |
|          1  | 04-29-17 |
|          1  | 05-18-17 |
+-----+-------+----------+

所需的输出如下所示:

+-----+-------+----------+--------+----------+
| Customer_ID | date     | received_discount |
+-----+-------+----------+--------+----------+
|          1  | 01-01-17 |        1          |
|          1  | 01-17-17 |        0          |
|          1  | 02-04-17 |        1          |
|          1  | 03-01-17 |        0          |
|          1  | 03-15-17 |        1          |
|          1  | 04-29-17 |        1          |
|          1  | 05-18-17 |        0          |
+-----+-------+----------+--------+----------+

我们正在 Netezza 中进行这项工作。我想不出只使用窗口函数,只使用递归和循环的方法。有没有我错过的一些聪明的技巧?

提前致谢, GF

【问题讨论】:

欢迎来到 SO。显示示例数据、示例输出以及您编写的产生错误结果的代码。另外,选择 1 个 RDBMS 作为标签。 您使用的是 mysql 还是 SQL Server?你尝试了什么?并且请将示例 dara 和预期结果发布为格式化文本 【参考方案1】:

您没有告诉我们您的后端是什么,也没有提供一些示例数据和预期输出,也没有提供合理的数据架构:(这是一个基于使用 postgreSQL 作为后端的架构猜测的示例(太混乱了作为评论): (我认为您在 trips 表中有 Customer_Id、Trip_Date 和 LocationId?)

select * from trips t1
where not exists (
  select * from trips t2 
  where t1.Customer_id = t2.Customer_id and
  t1.Trip_Date > t2.Trip_Date 
  and t1.Trip_date - t2.Trip_Date < 30
);

【讨论】:

这是一个很好的逻辑,但我认为 OP 想要一个标志而不是一个过滤器。 @GordonLinoff,然后 OP 可以将其更改为更新查询,但是当我编写此 OP 时没有任何架构、示例输出,因此没有要更新的字段。在黑暗的 IOW 中拍摄。

以上是关于SQL:查找锁定日期的棘手问题的主要内容,如果未能解决你的问题,请参考以下文章

sql 在特定表上查找锁定会话并将其终止。

SQL - 查找最接近当前日期的日期

引导日期选择器上的棘手问题

按日期查找记录sql Server

查找两个日期之间的差异 Oracle SQL

在 SQL Server 中查找最近的日期