好的,另一个新手SQL问题,我肯定有一个简单的解决方案,当有人发布答案时我会踢自己!
我有两张表如下
PRICE_DTA
PRC_DATE PRC_TIME PRC_PRICE PRC_ITEM
2008-01-01 06.00.00 1.05 JUMPER
2008-01-01 09.00.00 1.20 JUMPER
2008-01-25 17.00.00 1.75 JUMPER
2008-01-02 09.00.00 2.25 TROUSERS
2008-10-25 12.00.00 2.95 TROUSERS
SALE_DTA
TRN_DATE TRN_TIME TRN_PRICE_PAID TRN_ITEM
2008-01-01 08.30.00 JUMPER
2008-01-03 10.00.00 JUMPER
2008-01-03 17.00.00 JUMPER
2008-01-01 13.00.00 TROUSERS
2008-01-02 09.00.00 TROUSERS
价格的运作方式是您获得NEXT可用价格(价格直到购买后才设定,因为我们将所有订单批量上调并且价格越低,我们一次购买的价格就越高)。因此,在示例中,2008年1月1日的08.30.00购买将是1.20,因为这是购买日期/时间之后的第一个可用价格
因此,我需要使用TRN_DATE / TRN_TIME字段填充SALE_DTA表中的价格,以便从PRICE_DTA表中获取下一个可用价格。注意:两个表上的DATE和TIME字段是CHAR字段而不是日期/时间戳字段
我可以很容易地连接日期和时间,但我不确定如何在PRICE_DTA上找到第一条记录,日期/时间戳大于此值。我知道在UNISYS DMS II上我可以使用'查找下一个大于',但在SQL中找不到类似的命令?
我很乐意创建一个临时表作为解决方案的一部分,如果这样做更简单。
答案 0 :(得分:1)
通用的SQL解决方案可以通过几个连接来完成:
SELECT
* --TODO - Pick appropriate columns
FROM
SALE_DTA s
INNER JOIN
PRICE_DTA p
ON
p.PRC_ITEM = s.TRN_ITEM and
(p.PRC_DATE > s.TRN_DATE or
(p.PRC_DATE = s.TRN_DATE and
p.PRC_TIME > s.TRN_TIME
))
LEFT JOIN
PRICE_DTA p2
ON
p2.PRC_ITEM = s.TRN_ITEM and
(p2.PRC_DATE > s.TRN_DATE or
(p2.PRC_DATE = s.TRN_DATE and
p2.PRC_TIME > s.TRN_TIME
)) and
(p2.PRC_DATE < p.PRC_DATE or
(p2.PRC_DATE = p.PRC_DATE and
p2.PRC_TIME < p.PRC_TIME
))
WHERE
p2.PRC_ITEM IS NULL
希望你能看到这里的逻辑。 INNER JOIN
用于将SALE_DTA
中的行与之后发生的PRICE_DTA
中的所有行进行匹配。然后,我们再次对此LEFT JOIN
进行第二次联接(PRICE_DTA
),这次尝试使用此联接(p2
)找到一行,以便它仍然在{{1}之后发生日期/时间,但之前 s
日期/时间。
最后,在p
子句中,我们消除了WHERE
实际成功的所有行。因此,通过演绎,我们知道我们在LEFT JOIN
中匹配的行是p
中最早的行,它出现在PRICE_DTA
日期/时间之后。< / p>
答案 1 :(得分:0)
您当然可以获得所需的数据,但DB2不支持JOIN
语句UPDATE
。所以你可以采取不同的路线,如
创建辅助表
create table SALE_DTA_temp(TRN_DATE,TRN_TIME,TRN_PRICE_PAID,TRN_ITEM)
从查询中插入临时表
insert into SALE_DTA_temp
select sd.TRN_DATE,
sd.TRN_TIME,
tab.max_PRC_PRICE as TRN_PRICE_PAID,
sd.TRN_ITEM
from SALE_DTA sd
join
(
select PRC_DATE, max(PRC_PRICE) as max_PRC_PRICE
from PRICE_DTA
group by PRC_DATE
) tab on sd.TRN_DATE = tab.PRC_DATE
删除旧表
drop table SALE_DTA
重命名表
RENAME TABLE SALE_DTA_temp TO SALE_DTA