如何在 SQL 服务器中合并来自主 table 和日志 table 的信息
How to combine information from a main table and a log table in SQL Server
目前我的数据库中有 2 个 table 需要合并来自的信息。
其中之一是日志 table,它记录了系统中所有产品的状态变化。结构示例:
ChangeDate
Product
LastStatus
NewStatus
2021-10-01
A
New
Aging
2021-11-02
A
Aging
Ressuply
2021-11-25
A
Ressuply
OFF
2021-08-03
B
New
Aging
2021-09-04
B
New
Aging
2021-10-13
B
Ressuply
OFF
另一个是事实 table,其中包含每种产品的每次销售。
结构示例:
Date
Product
PricePaid
2021-10-02
A
124
2021-11-05
A
115
2021-08-25
B
223
2021-09-03
B
218
我想写一份声明,告诉我产品在售出时的状态。
期望的结果:
Date
Product
PricePaid
StatusAtTime
2021-10-02
A
124
Aging
2021-11-05
A
115
Ressuply
2021-08-25
B
223
Aging
2021-09-03
B
218
Aging
我已经苦思冥想了大约一个星期,似乎找不到答案。我想最大的挑战是性能,因为 table 有大约 2M 行,而且日志 table 也相当大。
提前谢谢大家:)
例如
select top(1) with ties s.*, l.NewStatus
from sales s
join statusLog l on s.Product = l.Product and s.Date >= l.ChangeDate
order by row_number() over(partition by s.Product, s.Date order by l.ChangeDate desc);
带样本数据returns
Date Product PricePaid NewStatus
2021-10-02 A 124 Aging
2021-11-05 A 115 Ressuply
2021-08-25 B 223 Aging
2021-09-03 B 218 Aging
目前我的数据库中有 2 个 table 需要合并来自的信息。 其中之一是日志 table,它记录了系统中所有产品的状态变化。结构示例:
ChangeDate | Product | LastStatus | NewStatus |
---|---|---|---|
2021-10-01 | A | New | Aging |
2021-11-02 | A | Aging | Ressuply |
2021-11-25 | A | Ressuply | OFF |
2021-08-03 | B | New | Aging |
2021-09-04 | B | New | Aging |
2021-10-13 | B | Ressuply | OFF |
另一个是事实 table,其中包含每种产品的每次销售。 结构示例:
Date | Product | PricePaid |
---|---|---|
2021-10-02 | A | 124 |
2021-11-05 | A | 115 |
2021-08-25 | B | 223 |
2021-09-03 | B | 218 |
我想写一份声明,告诉我产品在售出时的状态。 期望的结果:
Date | Product | PricePaid | StatusAtTime |
---|---|---|---|
2021-10-02 | A | 124 | Aging |
2021-11-05 | A | 115 | Ressuply |
2021-08-25 | B | 223 | Aging |
2021-09-03 | B | 218 | Aging |
我已经苦思冥想了大约一个星期,似乎找不到答案。我想最大的挑战是性能,因为 table 有大约 2M 行,而且日志 table 也相当大。
提前谢谢大家:)
例如
select top(1) with ties s.*, l.NewStatus
from sales s
join statusLog l on s.Product = l.Product and s.Date >= l.ChangeDate
order by row_number() over(partition by s.Product, s.Date order by l.ChangeDate desc);
带样本数据returns
Date Product PricePaid NewStatus
2021-10-02 A 124 Aging
2021-11-05 A 115 Ressuply
2021-08-25 B 223 Aging
2021-09-03 B 218 Aging