【发布时间】:2023-03-04 21:31:02
【问题描述】:
我的 SQL 中有两个表
例如Table1 - ItemPrice:
DATETIME | ITEM | PRICE
2011-08-28 | ABC 123
2011-09-01 | ABC 125
2011-09-02 | ABC 124
2011-09-03 | ABC 127
2011-09-04 | ABC 126
Table2 - DayScore:
DATETIME | ITEM | SCORE
2011-08-28 | ABC 1
2011-08-29 | ABC 8
2011-09-01 | ABC 4
2011-09-02 | ABC 2
2011-09-03 | ABC 7
2011-09-04 | ABC 3
我想写一个查询,给定一个项目 ID(例如 ABC),将返回该日期从 ItemPrice 的价格(如果该日期没有价格,那么查询不应该返回任何东西)。如果找到查询日期的有效价格,则查询应返回(9 列)
- 过去三天内
ItemPrice的商品价格(即查询日期前的最近3个价格)。 - 在接下来的三列中,它应该从
DayScore返回从 ItemPrice 中选择的这 3 个日期的匹配分数。 - 最后选择日期(t-1 到 t-3)
换句话说,仅查看 date='2011-09-03' 作为 item='abc' 示例的此查询的结果将返回:
DATE | ITEM | PRICE | SCR | PRC_t-1 | PRC_t-2 | PRC_t-3 | SCR_t-1 | SCR_t-2 | SCR_t-3 | DATE_t-1 | DATE_t-2 | DATE_t-3
2011-09-03| ABC | 127 | 7 | 124 | 125 | 123 | 2 | 4 | 1 | 2011-09-02| 2011-09-01| 2011-08-28
....
ItemPrice 表中出现的每个日期等。
运行此查询的最简洁和最有效的方法是什么(因为它会在数百万行中运行)?
干杯!
【问题讨论】:
-
我会的,但到目前为止,我很尴尬,并决定不发布,所以从头开始几乎就是我所处的位置......但简而言之,多选......
-
虽然这是一个有趣的挑战,取决于你如何定义“整洁”,它可能真的很整洁,但我怀疑它是否能有效地完成。我希望最快的方法是简单地将 ABC 的所有行作为直线行(项目、价格、分数)并使用您在那里拥有的任何编程语言在客户端上构建您的结构。
-
您似乎没有每个日历日的价格。换句话说,您的价格表看起来只包含商品价格更改日期的行。那是对的吗?这会让你陷入一个复杂的自我加入的境地。为了效率,你能定义一个时间范围吗?你能说不需要查看,比如说,超过 7 天的时间就可以获取最新的价格变化吗?
-
感谢 cmets。在这个阶段,我们确实将整洁定义为可理解和高效的工作过程。 @Eddy - 是的,这是一个非常好的主意,并且已经构建了包装视图,基本上给出了我在上面的示例中所拥有的内容。使用日历日,我们可以限制它(不理想),价格基本上是在交易日的任何价格上列出的(即公共假期或周末没有价格)。但可能还有其他情况下该项目没有交易,10 天的期限会更好,但如果您有 7 天限制的想法,我们会感兴趣!
-
有了客户端解决方案的想法,这是我们考虑过的。作为 Java,我们不应该对集合有任何问题,但我们真的希望每周将其作为批处理运行,考虑到我们正在查看的记录量,客户端解决方案变得更加令人沮丧,管理数据量,调整缓存,并冒着对数据库、网络 OH 等进行数千次调用的风险,这是我们希望避免的事情,并将此逻辑保留在以后的数据库中的数据中。多个选择、临时表等会比必须将数据移植到 Java 更好 (IMO)。
标签: mysql sql date join group-by