【问题标题】:how to find a record between a range date如何查找范围日期之间的记录
【发布时间】:2012-01-20 07:51:35
【问题描述】:

我有这些表:

表 1:

   date     |   idcurrency   |   total
2011-10-11  |       1        |    100
2011-10-14  |       1        |    500
2011-10-12  |       2        |    200
2011-11-01  |       2        |    100

表 2

   idcurrency  |   value   |   date
       1       |    200    | 2011-10-09
       1       |    350    | 2011-10-15
       2       |    200    | 2011-10-09
       2       |    250    | 2011-10-20

我需要根据table 1 中的total 字段与table 2 中的value 字段相乘来计算新的总数。 Table 2 保持货币价值的变化并且不是日期连续的,所以我不知道如何加入这些表格来实现我的目标


改变设计

我正在考虑改变 table2 的设计,添加一个新字段来保存货币值范围的最终日期,如下所示:

idcurrency | value |  start_date  |  end_date
     1        200     2011-10-09     2011-10-14
     1        350     2011-10-15     2011-12-14
     2        200     2011-10-09     2011-10-19
     2        250     2011-10-20     2011-12-14

然后,我可以在不使用“外部应用”的情况下加入 table1 和 table2,但现在我正在尝试查询以添加这个新字段

谢谢!!

【问题讨论】:

  • 你试过什么?您是否有一个您认为应该有效但无效的查询?
  • 您是否可以控制表格的设计,或者它们是否已修复?
  • 我无法控制设计,但如果我创建一个性能比“外部应用”解决方案更好的解决方案,我可以要求更改我正在考虑更改设计的设计table2,添加一个新字段以保存货币值范围的最终日期,如上。然后,我可以在不使用“外部应用”的情况下加入这些表,从而提高查询的性能

标签: sql-server tsql date join


【解决方案1】:

您可以使用outer apply 子查询来搜索货币的最新值:

select  t1.*
,       last_value.Value * t1.total
from    Table1 t1
outer apply
        (
        select  top 1 value
        from    Table2 t2
        where   t2.idcurrency = t1.idcurrency
                and t2.date <= t1.date
        order by
                t2.date desc
        ) last_value

【讨论】:

    【解决方案2】:

    像下面这样的东西呢(我没有测试过):

    SELECT *,total*value as Total
    FROM Table1 INNER JOIN (SELECT idCurrency,max(date) as value
    GROUP BY idCurrency,date)
    ON table1.idcurrency = table2.currency
    

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      相关资源
      最近更新 更多