Sql 选择值大于XXX的第一条记录

Sql 选择值大于XXX的第一条记录,sql,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

好的,另一个新手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
价格的工作方式是你得到下一个可用的价格(价格在购买后才确定,因为我们将所有的订单进行批量处理,一次购买越多,价格就越便宜)。因此,在本例中,2008-01-01的08.30.00购买价格为1.20,因为这是购买日期/时间之后的第一个可用价格

因此,我需要使用TRN_DATE/TRN_TIME字段填充SALE_DTA表中的价格,以便从price_DTA表中获取下一个可用价格。注意:两个表上的日期和时间字段都是字符字段,而不是日期/时间戳字段

我可以很容易地连接日期和时间,但我不确定如何在PRICE_DTA上找到日期/时间戳大于该值的第一条记录。我知道在UNISYS DMS II上我可以使用“查找下一个大于”命令,但在SQL中找不到类似的命令


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

这方面的通用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
选择
*--TODO-选择适当的列
从…起
出售
内连接
价格
在…上
p、 PRC_项目=s.TRN_项目和
(p.PRC\U日期>s.TRN\U日期或
(p.PRC_日期=s.TRN_日期和
p、 中国时间>美国时间
))
左连接
价格表p2
在…上
p2.PRC_项目=s.TRN_项目和
(p2.PRC_日期>s.TRN_日期或
(p2.PRC_日期=s.TRN_日期和
p2.PRC_时间>s.TRN_时间
))及
(p2.PRC_日期
希望你能看到这里的逻辑。
内部联接
用于将
SALE\u DTA
中的行与
PRICE\u DTA
中随后出现的所有行进行匹配。然后,我们再次对此
PRICE\u DTA
执行第二次联接(左联接),这次尝试定位具有此联接(
p2
)的行,使其仍然发生在
s
日期/时间之后,但发生在
p
日期/时间之前


最后,在
WHERE
子句中,我们消除了该
左连接实际成功的所有行。因此,通过推断,我们知道我们在
p
中匹配的行是
PRICE\u DTA
中最早的一行,它发生在
SALE\u DTA
日期/时间之后。

您当然可以获得所需的数据,但DB2不支持
JOIN
with
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

不能改用
DATETIME
字段吗?您使用的是什么DBMS?当连接来自其他表的数据时,UPDATE语句语法可能因供应商而异……这是AS/400机器上的DB2表。不幸的是,我没有设计数据库,所以尽管DATETIME可能会使它更容易,但我不能改变这一点,因为表是由我们的客户提供的。表的主键是什么<代码>日期
时间
项目
?价格的唯一键是日期、时间和价格。对于SALE_DTA,我没有包括一个额外的字段,因为我认为它与TRN_ID无关,它是一个唯一的顺序数字值