【问题标题】:SQL inner join with timestamps?带有时间戳的 SQL 内连接?
【发布时间】:2020-03-10 20:07:38
【问题描述】:

我目前有两张桌子。

表 1:销售额

saleId(int), saleTime(datetime), deviceId(varchar)

此表仅跟踪销售情况、销售时间以及完成的设备。

表 2:销售颜色

deviceId, color(varchar), timeDetected(datetime), timeRemoved(datetime), isActive(bit)

此表记录了每台设备上销售的颜色商品,并且每台设备一次只能销售一种颜色。例如,对于 DEVICE1,YELLOW 可能会在 3/10/20 00:00:00 到 3/10/20 10:15:00 之间出售。 timeDetected 表示颜色开始销售的时间,timeRemoved 是停止销售的时间。如果该商品仍在销售中,则 timeRemoved = null 且 isActive = 1。

我的目标 我需要能够提取在单个设备的时间范围内发生的所有交易以及所售商品的颜色。所以最终结果看起来像......

device, saleid, saleTime, color

我一直在使用以下方法来提取特定时间戳的颜色,但我似乎无法在查询中使用它来提取所有事务并将它们与当时的正确背景匹配。

select color
from SaleColor
where
(
    (timedetected < '3/10/20 08:15:00' and timeremoved > '3/10/20 08:15:00')
    or (timedetected < '3/10/20 08:15:00' and timeremoved is null)
)
and deviceId = 'DEVICE1'

如果我将上述语句嵌套到事务的 select 语句中,它会为每个事务设置相同的颜色。

有人可以帮助我以实际可行的方式设置这两个查询吗?

【问题讨论】:

  • 样本数据和预期结果将真正帮助我们帮助您。
  • 老实说,这听起来像真正的问题是设计没有很好地规范化。您在这些表之间有一个父/子,但连接听起来很松散,而不是精确。听起来你必须使用奇怪的时间范围来加入它们,而不是像订单号这样的实体。
  • Sean 是对的,但假设您不能对这里的模式做任何事情,Sales 中的 saleTime 列与 SaleColor 中的 timeDetectedtimeRemoved 列有什么关系? ?
  • 你不能加入ON s.deviceId = sc.deviceId AND s.saleTime &gt;= sc.timeDetected AND (sc.timeDetected IS NULL OR s.saleTime &lt;= sc.timeDetected)吗? (在这种情况下,sSalesscSaleColor

标签: sql sql-server


【解决方案1】:

您可以使用内连接来过滤相应的颜色:

select a.device, a.saleid, a.saleTime, b.color
from Sales a 
inner join SaleColor b
ON b.timedetected <= a.saletime and ISNULL(b.timeremoved,'01Jan2100') >= a.saletime
   and a.deviceId = b.deviceID 
   --and a.deviceId = 'DEVICE1'

我已经简化了你在这个问题上的条件。您可以调整 ON 条件以满足您的需要。希望这会有所帮助。

【讨论】:

  • 这就是工作。我不擅长使用 SQL,所以我不能 100% 确定如何正确格式化包含多个匹配项的连接。我对你的进行了一些编辑,现在它正在为我获取正确的信息。我很感激!
猜你喜欢
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 2017-11-22
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
相关资源
最近更新 更多