【问题标题】:Return Maximum Value Below Certain Parameter返回某个参数以下的最大值
【发布时间】:2021-11-07 22:23:05
【问题描述】:
我需要填充下面“生产输入”表中的 CalvingDate 字段来计算 DIM。
生产投入
| CowID |
ProductionDate |
DateCalved |
DaysInMilk [DIM] |
| 18001 |
08/10/2021 |
23/02/2021 |
168 |
| 17158 |
30/10/2021 |
???? |
??? |
| 17158 |
23/10/2021 |
01/10/2021 |
23 |
| 17158 |
16/10/2021 |
01/10/2021 |
15 |
| 17158 |
08/10/2021 |
01/10/2021 |
7 |
| 17158 |
07/08/2021 |
07/08/2020 |
365 |
我有一张表格,上面列出了每只动物的产犊日期
产犊日期
| CowID |
DateCalved |
| 18001 |
23/02/2021 |
| 17158 |
01/10/2021 |
| 17158 |
07/08/2020 |
基本逻辑是选择最接近ProductionDate但在ProductionDate之前的DateCalved。考虑第 3 行:我的 Sudo 代码将是:“给我 CowID 17158 小于生产日期 30/10/2021 的所有产犊日期的最大值”
如何使用 SQL Server 实现这一点?
【问题讨论】:
标签:
sql
sql-server
tsql
max
【解决方案1】:
样本数据:
create table ProductionInputs (
CowID int,
ProductionDate date,
DateCalved Date,
DaysInMilk int
);
create table CalvingDates (
CowID int,
DateCalved Date
);
insert into ProductionInputs
(CowID, ProductionDate) values
(18001, '2021-10-08'),
(17158, '2021-10-30'),
(17158, '2021-10-23'),
(17158, '2021-10-16'),
(17158, '2021-10-08'),
(17158, '2021-08-07');
insert into CalvingDates
(CowID, DateCalved) values
(18001, '2021-04-23'),
(17158, '2021-10-01'),
(17158, '2020-08-07');
更新声明
UPDATE t
SET t.DateCalved = ca.DateCalved
, t.DaysInMilk = DATEDIFF(day, ca.DateCalved, t.ProductionDate)
FROM ProductionInputs t
CROSS APPLY (
SELECT MAX(d.DateCalved) AS DateCalved
FROM CalvingDates d
WHERE d.CowId = t.CowId
AND d.DateCalved <= t.ProductionDate
) ca
结果
select * from ProductionInputs;
牛ID |生产日期 |日期卡尔维德 | DaysInMilk
----: | :------------- | :--------- | ---------:
18001 | 2021-10-08 | 2021-04-23 | 168
17158 | 2021-10-30 | 2021-10-01 | 29
17158 | 2021-10-23 | 2021-10-01 | 22
17158 | 2021-10-16 | 2021-10-01 | 15
17158 | 2021-10-08 | 2021-10-01 | 7
17158 | 2021-08-07 | 2020-08-07 | 365
db小提琴here