![](/img/trans.png)
[英]Updating a field in a table based on the sum of all previous dates in another table
[英]Get the previous dates from another table
我有2張桌子。 1個表格如下所示(值存儲為DD-MM-YYYY)
表A:
CustID | StartDate
1 | 20-1-2016
2 | 25-1-2016
2 | 17-6-2016
表B:
CustID | StartDate | EndDate
1 | 1-1-2016 | 15-1-2016
1 | 20-1-2016 | 1-4-2016
2 | 1-1-2015 | 1-6-2015
2 | 5-8-2015 | 31-12-2015
2 | 25-1-2016 | 31-5-2016
2 | 17-6-2016 | 31-12-2016
因此,我想要的是擁有表A中的所有數據。並在表B中找到上一個日期。因此,在表B中,從表A的起始日期之前的每個日期范圍中,我都希望有最高的EndDate。
所以它看起來像這樣:
決賽桌:
CustID | TableA.StartDate | TableB.EndDate (as Previous_date)
1 | 20-1-2016 | 15-1-2016
2 | 25-1-2016 | 31-12-2015
2 | 17-6-2016 | 31-5-2016
我希望這是足夠的信息以獲取幫助。 如果您需要更多,請告訴我。
我的解決方案是這樣的:
如果您也想從表B中選擇其他列,則它會起作用。
SELECT A.id
,A.startdate
,B.enddate
FROM tblA A
INNER JOIN tblB B
ON A.id = B.id
AND B.startdate = (
SELECT TOP 1 startdate
FROM tblB subB
WHERE A.id = subB.ID
AND subB.startdate < A.startdate
ORDER BY startdate desc
)
如果要重現結果,請參見以下鏈接: http ://rextester.com/SGNX33699
我將使用LAG解析功能執行此操作:
WITH a AS (SELECT 1 custid, to_date('20/01/2016', 'dd/mm/yyyy') startdate FROM dual UNION ALL
SELECT 2 custid, to_date('25/01/2016', 'dd/mm/yyyy') startdate FROM dual UNION ALL
SELECT 2 custid, to_date('17/06/2016', 'dd/mm/yyyy') startdate FROM dual),
b AS (SELECT 1 custid, to_date('01/01/2016', 'dd/mm/yyyy') startdate, to_date('15/01/2016', 'dd/mm/yyyy') enddate FROM dual UNION ALL
SELECT 1 custid, to_date('20/01/2016', 'dd/mm/yyyy') startdate, to_date('01/04/2016', 'dd/mm/yyyy') enddate FROM dual UNION ALL
SELECT 2 custid, to_date('01/01/2015', 'dd/mm/yyyy') startdate, to_date('01/06/2016', 'dd/mm/yyyy') enddate FROM dual UNION ALL
SELECT 2 custid, to_date('05/08/2015', 'dd/mm/yyyy') startdate, to_date('31/12/2015', 'dd/mm/yyyy') enddate FROM dual UNION ALL
SELECT 2 custid, to_date('25/01/2016', 'dd/mm/yyyy') startdate, to_date('31/05/2016', 'dd/mm/yyyy') enddate FROM dual UNION ALL
SELECT 2 custid, to_date('17/06/2016', 'dd/mm/yyyy') startdate, to_date('31/12/2016', 'dd/mm/yyyy') enddate FROM dual),
b2 AS (SELECT custid,
startdate,
enddate,
lag(enddate) OVER (PARTITION BY custid ORDER BY startdate) prev_enddate
FROM b)
SELECT a.custid,
a.startdate,
b2.prev_enddate
FROM a
INNER JOIN b2 ON a.startdate = b2.startdate;
CUSTID STARTDATE PREV_ENDDATE
---------- ----------- ------------
1 20/01/2016 15/01/2016
2 25/01/2016 31/12/2015
2 17/06/2016 31/05/2016
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.