【问题标题】:Select replace empty values with values from different date选择用不同日期的值替换空值
【发布时间】:2018-12-10 18:22:22
【问题描述】:

我正在使用 SQL Server,我有一个简单的查询

SELECT TOP 10 * 
FROM Rates 
WHERE Date = '2017-06-09 00:00:00'

该日期没有费率,如果没有费率,查询应该给我 2017-06-08 00:00:00 的结果 样本数据:

dtmDate int     CurrencyCode    strCurrency dblInRate   dblCCRate 
2012-05-16 00:00:00 12           DZD       0.010545     0.010545 
2012-05-11 00:00:00 12           DZD       0.010511     0.010511
2006-06-26 00:00:00 12           DZD       0.011334     0.011334 
2016-03-30 00:00:00 12           DZD       0.008309     0.008309 
2017-04-26 00:00:00 12           DZD       0.008530     0.008530 
2017-04-28 00:00:00 12           DZD       0.008561     0.008561 
2017-05-03 00:00:00 12           DZD       0.008530     0.008530 
2017-10-13 00:00:00 12           DZD       0.007587     0.007587 
2017-10-19 00:00:00 12           DZD       0.007581     0.007581 

--对于 2018-06-09,表中没有任何记录,我需要将其替换为上一个日期。

那么当日期为 2017 年 6 月 9 日时,如何让它选择所有日期的所有费率,然后使用 2017 年 6 月 8 日的费率,否则使用相应日期的费率?

【问题讨论】:

  • 如果2017-06-08 没有数据会怎样??
  • 如果没有 6 月 8 日的数据,它应该带来 7 日的数据?
  • 一个简单的WHERE Date <= '2017-06-09 00:00:00' ORDER BY Date DESC 可以吗?如果不是,那么选择前一天的确切规则是什么?如果 2017-06-08 也没有数据,那怎么办?
  • 您能添加一些示例数据和每天的预期结果吗?此外,如果您分别查询每一天,那么如果 9 日没有数据,那么您应该已经拥有 8 日的数据。只需在显示屏上再次发布即可。无需反复查询数据。
  • 大卫 包括问题的数据和预期输出,而不是 cmets 您可以在此处格式化您的数据stackoverflow.com/questions/3006431/…

标签: sql sql-server tsql


【解决方案1】:

这是一种方法:

SELECT TOP 10 r.* 
FROM (SELECT TOP (1) WITH TIES r.*
      FROM Rates r
      WHERE Date <= '2017-06-09'
      ORDER BY Date DESC
     ) r;

TOP (1) WITH TIES 返回所有日期相同的记录(假设没有时间分量,这与您的示例数据和问题一致)。 WHERE 表示日期不迟于 2017-06-09。 ORDER BY 表示它是指定日期或之前的最近日期。

外部TOP (10) 任意选择其中的 10 个,您的查询也是如此。

【讨论】:

  • 嗨,戈登,谢谢,但这不是我需要的。我需要这张表中的所有数据,而且我知道没有数据可以反映这个正确的日期,所以我需要在日期为 9.6.2018 时从费率中选择 *,然后使用日期为 8.6.2017 的费率
  • @DavidBelovezcik 。 . .这就是这个查询的作用。
  • 这是一个聪明的解决方案,据我了解,内部选择将返回单日的所有价格 (top 1 with ties),并且订单保证您将在给定日期之前或给定日期获得最新的可用价格。
【解决方案2】:

您可以将特定列转换为“日期”并将其与过滤器进行比较。就这样:

SELECT TOP 10 * 
FROM Rates 
WHERE cast(Date as date)= '2017-06-09'

【讨论】:

    【解决方案3】:
    SELECT TOP 10 * 
    FROM Rates 
    WHERE Date <= '2017-06-09 00:00:00'
    ORDER BY Date DESC
    

    【讨论】:

      猜你喜欢
      • 2013-04-20
      • 2014-06-03
      • 1970-01-01
      • 2020-04-07
      • 2016-09-25
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多