Sql 获取下一个大于值的日期时间
从表中获取同一类型的下一个可用时间,该时间大于该类型的可用拾取时间。我尝试使用第一个值函数,但似乎效果不好Sql 获取下一个大于值的日期时间,sql,amazon-web-services,amazon-redshift,Sql,Amazon Web Services,Amazon Redshift,从表中获取同一类型的下一个可用时间,该时间大于该类型的可用拾取时间。我尝试使用第一个值函数,但似乎效果不好 DROP TABLE IF EXISTS Test1; CREATE TEMPORARY TABLE Test1 ( Type VARCHAR(50), Pickup_Time TIMESTAMP, INSERT_TIME TIMESTAMP ); DROP TABLE IF EXISTS Test2; CREATE TEMPORARY TA
DROP TABLE IF EXISTS Test1;
CREATE TEMPORARY TABLE Test1
(
Type VARCHAR(50),
Pickup_Time TIMESTAMP,
INSERT_TIME TIMESTAMP
);
DROP TABLE IF EXISTS Test2;
CREATE TEMPORARY TABLE Test2
(
Type VARCHAR(50),
TIMEFRAME TIMESTAMP
);
INSERT INTO Test1
VALUES ('MAN', '2020-11-01 09:00:00.000000', '2020-11-01 06:00:00.000000');
INSERT INTO Test1
VALUES ('CAT', '2020-11-02 11:00:00.000000', '2020-11-02 05:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 01:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 02:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 03:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 04:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 05:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 06:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 07:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 08:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 09:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 10:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 11:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 12:00:00.000000');
INSERT INTO Test2
VALUES ('MAN', '2020-11-01 13:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-01 01:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-01 02:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-01 03:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-01 04:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-01 05:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-02 06:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-02 07:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-02 08:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-02 09:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-02 10:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-02 11:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-02 12:00:00.000000');
INSERT INTO Test2
VALUES ('CAT', '2020-11-02 13:00:00.000000');
SELECT DISTINCT TT.*,
FIRST_VALUE(CT.TIMEFRAME)
OVER (PARTITION BY TT.Type ORDER BY TIMEFRAME rows between unbounded preceding and unbounded following)
FROM Test1 TT
INNER JOIN Test2 CT on TT.Type = CT.Type
AND TT.Pickup_Time < CT.TIMEFRAME;
但是,当我用不同的时间为类型MAN执行另一次插入并尝试运行相同的SQL语句时,它不符合我的条件
INSERT INTO Test1
VALUES ('MAN', '2020-11-01 03:00:00.000000', '2020-11-01 01:00:00.000000');
+----+--------------------------+--------------------------+--------------------------+
|type|pickup_time |insert_time |first_value |
+----+--------------------------+--------------------------+--------------------------+
|MAN |2020-11-01 03:00:00.000000|2020-11-01 01:00:00.000000|2020-11-01 04:00:00.000000|
|MAN |2020-11-01 09:00:00.000000|2020-11-01 06:00:00.000000|2020-11-01 04:00:00.000000|
|CAT |2020-11-02 11:00:00.000000|2020-11-02 05:00:00.000000|2020-11-02 12:00:00.000000|
+----+--------------------------+--------------------------+--------------------------+
对于上述第二个人工输入,该值应为2020-11-01 10:00:00.000000,而不是2020-11-01 04:00:00.000000
如果是,这里使用的第一个值是正确的选项吗?如果是,如何导出逻辑,或者哪一个是可以用来实现这一点的最佳函数。发生错误的原因是,对于
MAN
有两个条目,但您只需按类型划分,因此两个条目的处理方式相同,您需要按拾取时间
或插入时间
进行分区:
FIRST_值(连续时间)
OVER(按TT.Type划分,按TT.picku时间顺序划分,按无界前后行之间的时间帧行划分)
这将产生:
type pickup_time insert_time first_value
MAN 2020-11-01 03:00:00 2020-11-01 01:00:00 2020-11-01 04:00:00
CAT 2020-11-02 11:00:00 2020-11-02 05:00:00 2020-11-02 12:00:00
MAN 2020-11-01 09:00:00 2020-11-01 06:00:00 2020-11-01 10:00:00
非常感谢Philipp,很抱歉延迟了响应,我正在用我的数据集测试它,它工作得非常好
type pickup_time insert_time first_value
MAN 2020-11-01 03:00:00 2020-11-01 01:00:00 2020-11-01 04:00:00
CAT 2020-11-02 11:00:00 2020-11-02 05:00:00 2020-11-02 12:00:00
MAN 2020-11-01 09:00:00 2020-11-01 06:00:00 2020-11-01 10:00:00