【发布时间】:2021-10-18 18:01:38
【问题描述】:
priceQuote 表,给出一个日期范围内的类别和价格,但是有效的日期总是一个非常大的日期。
另一个表是Item表,它给出了itemID和它的类别以及日期
想法是根据类别和日期将这两个表连接起来,例如,ITEMID 0503848220,类别 1117,日期 2020-07-02 应该返回 $730(金额字段)。
下面是我的尝试,当然它并没有像我想要的那样工作
SELECT
Item.ItemID
,Item.Date
,ValidFROM
,ValidTo
,priceQuote.AMOUNT
From
Item
JOIN
priceQuote
on
Item.category=priceQuote.Category
and
Item.Date between ValidFROM and ValidTo
我想知道执行此操作的最佳方法是什么(考虑到这两个表非常大,并且在加入日期范围时可能会出现性能问题)。如果没有在 SQL 中进行联接的好方法,我愿意接受其他解决方案,例如将这两个表加载到 C# 应用程序中并通过 C# 进行计算。
感谢您的帮助。
数据示例(不知道如何在此处附加 Excel 文件):
+----------+-----------+------------+--------+
| Category | ValidFROM | ValidTo | AMOUNT |
+----------+-----------+------------+--------+
| 1113 | 4/1/2020 | 12/31/9999 | 665 |
| 1113 | 7/1/2020 | 12/31/9999 | 925 |
| 1113 | 5/10/2021 | 12/31/9999 | 491 |
| 1117 | 4/1/2020 | 12/31/9999 | 495 |
| 1117 | 7/1/2020 | 12/31/9999 | 730 |
| 1117 | 1/1/2021 | 12/31/9999 | 556 |
| 1117 | 5/10/2021 | 12/31/9999 | 555 |
+----------+-----------+------------+--------+
物品表:
+-----------+----------+-----------+
| ItemID | category | Date |
+-----------+----------+-----------+
| 503848220 | 1117 | 7/2/2020 |
| 503848221 | 1117 | 7/2/2020 |
| 503848225 | 1117 | 7/3/2020 |
| 503848227 | 1117 | 7/6/2020 |
| 503848228 | 1117 | 7/6/2020 |
| 503848266 | 1113 | 6/26/2020 |
+-----------+----------+-----------+
【问题讨论】:
-
不应该 ValidTo 成为下一个 ValidFrom - 1 天吗?这些数据尚无定论。
-
这能回答你的问题吗? Get top 1 row of each group您想要一个行号解决方案或
APPLY -
第一个表中的
ValidTo似乎毫无用处。您是否可以选择将此列更新为有用的值(即下一个ValidFrom的前一天) -
@Nick.McDermaid 谢谢。我同意。这是完全没用的。我无法修改该表。
-
@Charlieface 谢谢。但我在这里的问题并不一定意味着 ITEM 使用 pricequote 表上的最新日期。 ITEM 可以是任何日期。
标签: sql sql-server join