选择值大于XXX的FIRST记录

时间:2014-07-23 13:54:04

标签: sql

好的,另一个新手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中找不到类似的命令?

我很乐意创建一个临时表作为解决方案的一部分,如果这样做更简单。

2 个答案:

答案 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