sql - 将日期时间与另一个表 date_time 进行比较
问题描述
select uid , max(price) keep(dense_rank last order by usage_date ASC) amount
from HISTORY group by uid" ;
将 HISTORY 与 ADJUSTMENT 进行比较 如果最新的 usage_date(每个 id )早于(sen_date) 我想添加 ADJUSTMENT 的价格 我该怎么做?
*如果usage_date早于ADJUSTMENT,我想将ADJUSTMENT的价格添加到max(price),在这种情况下uid = 5应该添加200
ADJUSTMENT
uid,price,sen_date
1,100,2020-10-23
2,200,2020-10-23
2,200,2020-09-22
2,200,2020-08-23
2,200,2020-10-22
3,300,2020-10-20
5,200,2020-10-20
HISTORY
uid,price,usage_date
1,1000,2020-10-23
1,1000,2020-10-19
1,1000,2020-10-03
2,1000,2020-10-23
3,1000,2020-10-23
3,1000,2020-10-23
3,1000,2020-10-23
4,1000,2020-10-20
4,1000,2020-10-23
4,1000,2020-10-19
4,1000,2020-10-23
4,1000,2020-10-23
5,1000,2020-10-02
5,1000,2020-10-03
5,1000,2020-10-04
6,1000,2020-10-23
7,1000,2020-10-23
解决方案
将您的查询和它带到与以后日期相关的表LEFT OUTER JOIN
的类似查询中,然后用于组合日期:ADJUSTMENT
uid
COALESCE
SELECT h."UID",
h.usage_date,
a.sen_date,
h.price AS base_price,
COALESCE( a.price, 0 ) AS price_adjustment,
h.price + COALESCE( a.price, 0 ) AS price
FROM (
SELECT "UID",
MAX( usage_date ) AS usage_date,
MAX(price) KEEP ( DENSE_RANK LAST ORDER BY usage_date ASC) AS price
FROM HISTORY
GROUP BY "UID"
) h
LEFT OUTER JOIN
(
SELECT "UID",
MAX( sen_date ) AS sen_date,
MAX(price) KEEP ( DENSE_RANK LAST ORDER BY sen_date ASC) AS price
FROM ADJUSTMENT
GROUP BY "UID"
) a
ON ( h."UID" = a."UID" AND h.usage_date < a.sen_date )
ORDER BY "UID"
其中,对于样本数据:
CREATE TABLE adjustment ( "UID",price,sen_date ) AS
SELECT 1,100,DATE '2020-10-23' FROM DUAL UNION ALL
SELECT 2,200,DATE '2020-10-23' FROM DUAL UNION ALL
SELECT 2,200,DATE '2020-09-22' FROM DUAL UNION ALL
SELECT 2,200,DATE '2020-08-23' FROM DUAL UNION ALL
SELECT 2,200,DATE '2020-10-22' FROM DUAL UNION ALL
SELECT 3,300,DATE '2020-10-20' FROM DUAL UNION ALL
SELECT 5,200,DATE '2020-10-20' FROM DUAL;
CREATE TABLE HISTORY ( "UID",price,usage_date) AS
SELECT 1,1000,DATE '2020-10-23' FROM DUAL UNION ALL
SELECT 1,1000,DATE '2020-10-19' FROM DUAL UNION ALL
SELECT 1,1000,DATE '2020-10-03' FROM DUAL UNION ALL
SELECT 2,1000,DATE '2020-10-23' FROM DUAL UNION ALL
SELECT 3,1000,DATE '2020-10-23' FROM DUAL UNION ALL
SELECT 3,1000,DATE '2020-10-23' FROM DUAL UNION ALL
SELECT 3,1000,DATE '2020-10-23' FROM DUAL UNION ALL
SELECT 4,1000,DATE '2020-10-20' FROM DUAL UNION ALL
SELECT 4,1000,DATE '2020-10-23' FROM DUAL UNION ALL
SELECT 4,1000,DATE '2020-10-19' FROM DUAL UNION ALL
SELECT 4,1000,DATE '2020-10-23' FROM DUAL UNION ALL
SELECT 4,1000,DATE '2020-10-23' FROM DUAL UNION ALL
SELECT 5,1000,DATE '2020-10-02' FROM DUAL UNION ALL
SELECT 5,1000,DATE '2020-10-03' FROM DUAL UNION ALL
SELECT 5,1000,DATE '2020-10-04' FROM DUAL UNION ALL
SELECT 6,1000,DATE '2020-10-23' FROM DUAL UNION ALL
SELECT 7,1000,DATE '2020-10-23' FROM DUAL;
输出:
识别码 | 使用日期 | 发送日期 | 基本价格 | 价格调整 | 价格 --: | :--------- | :-------- | ---------: | ---------------: | ----: 1 | 20 年 10 月 23 日 | 空 | 1000 | 0 | 1000 2 | 20 年 10 月 23 日 | 空 | 1000 | 0 | 1000 3 | 20 年 10 月 23 日 | 空 | 1000 | 0 | 1000 4 | 20 年 10 月 23 日 | 空 | 1000 | 0 | 1000 5 | 04-OCT-20 | 20-OCT-20 | 1000 | 200 | 1200 6 | 20 年 10 月 23 日 | 空 | 1000 | 0 | 1000 7 | 20 年 10 月 23 日 | 空 | 1000 | 0 | 1000
db<>在这里摆弄
推荐阅读
- sql - SQL 滚动 LTV(生命周期价值)
- node.js - 如何停止 expressjs 服务器
- sql - 如何连接两个表,然后计算 SQL Server 中特定月份的不同值的数量?
- postgresql - 整数的无效输入语法:“0A000” 上下文:PL/pgSQL 函数触发器更新
- python - 如何在保留标记的同时重绘 seaborn 传奇条目?
- php - 有没有办法使用 Google API(通过 PHP)获得“HTTP Referrer”限制?
- python - 如何在存储在列表中的连续字典中添加元素
- javascript - Node.js 中的 bcrypt() 方法中的异步函数是如何工作的?
- javascript - 我将一个函数(不是谓词)传递给 Array.Filter,它返回给我整个数组 - 它是如何工作的?
- c# - Entity Framework Core Put 请求仅部分更新不会更新文件