【发布时间】: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中的timeDetected和timeRemoved列有什么关系? ? -
你不能加入
ON s.deviceId = sc.deviceId AND s.saleTime >= sc.timeDetected AND (sc.timeDetected IS NULL OR s.saleTime <= sc.timeDetected)吗? (在这种情况下,s是Sales,sc是SaleColor)
标签: sql sql-server