当前在线人数14361
首页 - 分类讨论区 - 电脑网络 - 数据库版 - 同主题阅读文章

此篇文章共收到打赏
0

  • 10
  • 20
  • 50
  • 100
您目前伪币余额:0
未名交友
[更多]
[更多]
请教高手这种join怎么办?
[版面:数据库][首篇作者:robustsong] , 2020年10月27日15:51:06 ,1088次阅读,18次回复
来APP回复,赚取更多伪币 关注本站公众号:
[分页:1 ]
robustsong
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 1 ]

发信人: robustsong (莫非), 信区: Database
标  题: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Tue Oct 27 15:51:06 2020, 美东)

我现在有一个table,里面存了下面的信息
ID    Event_Date    Event_Desc
1    1/3/2020    Applied
1    1/5/2020    Approved
2    1/4/2020    Applied
2    1/6/2020    Denied
每个ID申请了之后,就会出现一个申请的日期,approved之后就会出现approved的日期。
但是这个table有个问题,我想选在1/4/2020有多少人applied/approved/denied.这个
是不行的

我现在想生成个带完全日期的记录。先生成一个日期 reference table

Date
1/1/2020
1/2/2020
1/3/2020

10/27/2020

跟上面的table join一下,变成下面的这个

Date           ID    Event_Desc
1/1/2020       
1/2/2020       
1/3/2020    1    Applied
1/4/2020    1    Applied
1/4/2020    2    Applied
1/5/2020    1    Approved
1/5/2020    2    Applied
1/6/2020    1    Approved
1/6/2020    2    Denied
1/7/2020    1    Approved
1/7/2020    2    Denied
1/8/2020    1    Approved
1/8/2020    2    Denied
…       

这样子我就可以随意选任何的一天来分析当天的数据。之后还可以生成一个daily
trend chart.

请教一下,Oracle sql怎么实现这个join?谢谢


--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 141.]

 
asshole
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 2 ]

发信人: asshole (nice), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Tue Oct 27 16:12:03 2020, 美东)

just generate a table first with all date. maybe a small loop to generate it?

you may find something online.

then use it to left join our own data table.
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 129.]

 
robustsong
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 3 ]

发信人: robustsong (莫非), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Wed Oct 28 09:42:45 2020, 美东)

date list我已经生成了。我现在的难点就是如何left join生成我想要的table。
简单的left join生成的结果跟原数据table没什么区别。
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 141.]

 
eagle7
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 4 ]

发信人: eagle7 (衣勾七), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Wed Oct 28 14:32:16 2020, 美东)

先把日期和Event分开,生成两个不同的column。然后用新生成的日期来filter。

那个多少人的输出用count,可以count(ID),或者count(distinct ID)
--
※ 修改:·eagle7 於 Oct 28 14:34:36 2020 修改本文·[FROM: 2601:282:177f:8a]
※ 来源:· 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:282:177f:8]

 
PCB
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 5 ]

发信人: PCB (越学越笨), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Wed Oct 28 22:56:00 2020, 美东)

"我想选在1/4/2020有多少人applied/approved/denied"
楼主究竟想要啥呢?

SELECT DISTINCT ID
    FROM table
    WHERE EVENT_DATE = '2020-01-04' AND EVENT_DESC IN ('applied', 'approved'
, 'denied')

不是你想要的结果
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 47.]

 
robustsong
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 6 ]

发信人: robustsong (莫非), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Thu Oct 29 09:39:49 2020, 美东)

我问的是如何来做这个join。join做好了,就可以选择某一天的数据进行分析,跟你写
的这个类似。

比如ID = 1的这个人, 1月3号申请了一张信用卡,他就会在1/3/2020有一个applied的
记录。1/5号信用卡批准,就会在1/5/2020有一个approved的记录。但是在原始的table
里面,这个人就只有这么两个记录。如果想知道1月10号这个人的状态,这就不能直接
设定日期等于1/10/2020,必须要做一个比较,小于这个日期的是怎么样的。

我现在想通过join一个date list做一个全历史的table,这样子,申请人只要申请过以
后,每天都会有记录,最开始是applied,等到decision变成approved后就一直是
approved。这个数据结果可以直接做data visualization了。

现在关键的问题是如何通过join来fill那些日期。简单的left join并不能fill这些日期

【 在 PCB (越学越笨) 的大作中提到: 】
: "我想选在1/4/2020有多少人applied/approved/denied"
: 楼主究竟想要啥呢?
: SELECT DISTINCT ID
:     FROM table
:     WHERE EVENT_DATE = '2020-01-04' AND EVENT_DESC IN ('applied', '
approved'
: , 'denied')
: 不是你想要的结果



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 141.]

 
robustsong
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 7 ]

发信人: robustsong (莫非), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Thu Oct 29 09:44:17 2020, 美东)

现在我的难点是如何在left join的时候fill那些在原始数据table里面没有记录的日期。



【 在 eagle7 (衣勾七) 的大作中提到: 】
: 先把日期和Event分开,生成两个不同的column。然后用新生成的日期来filter。
: 那个多少人的输出用count,可以count(ID),或者count(distinct ID)



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 141.]

 
PCB
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 8 ]

发信人: PCB (越学越笨), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Thu Oct 29 15:17:46 2020, 美东)

so you want last available status, if there is any

SELECT T.[ID], T.[EVENT_DESC], TODAY()
FROM
table AS T
INNER JOIN
(
SELECT [ID],  MAX([EVENT_DATE]) AS LAST_EVENT_DATE
FROM table
WHERE [EVENT_DATE] < TODAY()
GROUP BY [ID]
) AS LAST_EVENT_LIST ON T.[ID] = LAST_EVENT_LIST.[ID] AND T.[EVENT_DATE] =
LAST_EVBENT_LIST.[LAST_EVENT_DATE]

【 在 robustsong (莫非) 的大作中提到: 】
: 现在我的难点是如何在left join的时候fill那些在原始数据table里面没有记录的日
期。




--
※ 修改:·PCB 於 Oct 29 15:39:31 2020 修改本文·[FROM: 47.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 47.]

 
nmamtf
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 9 ]

发信人: nmamtf (nmamtf), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Thu Nov  5 21:10:39 2020, 美东)

-- This script generate the date data in range:

SELECT TO_DATE ('01-JAN-2020') + ROWNUM - 1
  FROM (SELECT ROWNUM
          FROM (    SELECT 1
                      FROM DUAL
                CONNECT BY LEVEL <=
          (TO_DATE ('01-FEB-2020') - TO_DATE ('01-JAN-2020'))));

-- This script generate the user data :

CREATE TABLE ROBUSTSONG
(
ID INTEGER,
EVENT_DATE DATE,
EVENT_DESC VARCHAR2(100)
);

Insert into ROBUSTSONG
   (ID, EVENT_DATE, EVENT_DESC)
Values
   (1, TO_DATE('1/3/2020', 'MM/DD/YYYY'), 'Applied');
Insert into ROBUSTSONG
   (ID, EVENT_DATE, EVENT_DESC)
Values
   (1, TO_DATE('1/5/2020', 'MM/DD/YYYY'), 'Approved');
Insert into ROBUSTSONG
   (ID, EVENT_DATE, EVENT_DESC)
Values
   (2, TO_DATE('1/4/2020', 'MM/DD/YYYY'), 'Applied');
Insert into ROBUSTSONG
   (ID, EVENT_DATE, EVENT_DESC)
Values
   (2, TO_DATE('1/6/2020', 'MM/DD/YYYY'), 'Denied');
Insert into ROBUSTSONG
   (ID, EVENT_DATE, EVENT_DESC)
Values
   (3, TO_DATE('1/3/2020', 'MM/DD/YYYY'), 'Applied');
COMMIT;

-- This script generate the result :

SELECT A.*, B.* FROM

(SELECT TO_DATE ('01-JAN-2020') + ROWNUM - 1 AS EVENT_DATE
  FROM (SELECT ROWNUM
          FROM (    SELECT 1
                      FROM DUAL
                CONNECT BY LEVEL <=
          (TO_DATE ('01-FEB-2020') - TO_DATE ('01-JAN-2020'))))  ) A, 
           ROBUSTSONG B    
                         
WHERE A.EVENT_DATE = B.EVENT_DATE(+)
ORDER BY A.EVENT_DATE, B.ID;

--out put

1/1/2020           
1/2/2020           
1/3/2020    1    1/3/2020    Applied
1/3/2020    3    1/3/2020    Applied
1/4/2020    2    1/4/2020    Applied
1/5/2020    1    1/5/2020    Approved
1/6/2020    2    1/6/2020    Denied
1/7/2020           
1/8/2020 
:
:
1/31/2020         
       

Is this what you need?
                                          


【 在 robustsong (莫非) 的大作中提到: 】
: 我现在有一个table,里面存了下面的信息
: ID    Event_Date    Event_Desc
: 1    1/3/2020    Applied
: 1    1/5/2020    Approved
: 2    1/4/2020    Applied
: 2    1/6/2020    Denied
: 每个ID申请了之后,就会出现一个申请的日期,approved之后就会出现approved的日
期。
: 但是这个table有个问题,我想选在1/4/2020有多少人applied/approved/denied.这个
: 是不行的
: 我现在想生成个带完全日期的记录。先生成一个日期 reference table
: ...................





--
※ 修改:·nmamtf 於 Nov  5 21:25:02 2020 修改本文·[FROM: 152.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 152.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 10 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Wed Dec  9 09:17:58 2020, 美东)

听起来你想要的是任意一天所有客户状态的snapshot。这应该是一个range join的问题。

可以在原table上加一个字段,叫Event_End_Date,和Event_Date一起构成一个range。
方法是用analytic function:
select lead(Event_Date) over (partition by ID order by Event_Date) as Event_
End_Date.

查询的时候,比如你有一个as_of_date=1/10/2020,你就
select *
from table
where as_of_date between Event_Date and Event_End_Date-1

加了这个字段之后,那个table就相当于一个type 2 dimension table,也有人叫
factless fact table。它包含所有的历史。另外加了那个字段并不改变table key结构
,primary key仍然是ID+Event_Date。

如果不能改变原table结构的话,那就外置一个table,叫range_lookup table,把ID,
Event_Date,Event_End_Date放在这里。查询的时候把它join上,相当于把这个字段加
到原table上了。


【 在 robustsong (莫非) 的大作中提到: 】
: 我问的是如何来做这个join。join做好了,就可以选择某一天的数据进行分析,跟你写
: 的这个类似。
: 比如ID = 1的这个人, 1月3号申请了一张信用卡,他就会在1/3/2020有一个applied的
: 记录。1/5号信用卡批准,就会在1/5/2020有一个approved的记录。但是在原始的
table
: 里面,这个人就只有这么两个记录。如果想知道1月10号这个人的状态,这就不能直接
: 设定日期等于1/10/2020,必须要做一个比较,小于这个日期的是怎么样的。
: 我现在想通过join一个date list做一个全历史的table,这样子,申请人只要申请过以
: 后,每天都会有记录,最开始是applied,等到decision变成approved后就一直是
: approved。这个数据结果可以直接做data visualization了。
: 现在关键的问题是如何通过join来fill那些日期。简单的left join并不能fill这些
日期
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
smallburrito
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 11 ]

发信人: smallburrito (smallburrito), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Thu Dec 10 18:38:13 2020, 美东)

你这个TABLE建的有问题,把所有的EVENT去UPDATE这个表,应该是这样的

PID   AppliedFlg  AppliedDt   ApprovedFlg   ApprovedDt DeniedFlg  DeniedDt
1       1           1/4/2020    null        null        null       null
2       1           1/5/2020     1          1/6/2020    null       null
3       1           1/5/2020     null        null       1          1/7/2020
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 38.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 12 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Thu Dec 10 21:28:30 2020, 美东)

他这个是个journal table。

【 在 smallburrito (smallburrito) 的大作中提到: 】
: 你这个TABLE建的有问题,把所有的EVENT去UPDATE这个表,应该是这样的
: PID   AppliedFlg  AppliedDt   ApprovedFlg   ApprovedDt DeniedFlg  DeniedDt
: 1       1           1/4/2020    null        null        null       null
: 2       1           1/5/2020     1          1/6/2020    null       null
: 3       1           1/5/2020     null        null       1          1/7/
2020




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
smallburrito
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 13 ]

发信人: smallburrito (smallburrito), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Fri Dec 11 18:05:17 2020, 美东)

这是每个人的STATUS TABLE,
你关心的是STATUS状态和什么时候变的,
这才是USABLE TABLE,那个EVENT TABLE
就是个LOG TABLE,没有使用价值,
因为有一个潜在的SEQUENCE存在
APPLY->APPROVE
APPLY->DENY


【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 他这个是个journal table。
: 2020




--
※ 修改:·smallburrito 於 Dec 11 18:07:40 2020 修改本文·[FROM: 38.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 38.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 14 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Fri Dec 11 18:20:23 2020, 美东)

他有这么一个table,这是起始条件。接下来怎么做,这就是他来问的问题。你打算怎
么做?

【 在 smallburrito (smallburrito) 的大作中提到: 】
: 这是每个人的STATUS TABLE,
: 你关心的是STATUS状态和什么时候变的,
: 这才是USABLE TABLE,那个EVENT TABLE
: 就是个LOG TABLE,没有使用价值,
: 因为有一个潜在的SEQUENCE存在
: APPLY->APPROVE
: APPLY->DENY




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
smallburrito
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 15 ]

发信人: smallburrito (smallburrito), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Fri Dec 11 18:50:32 2020, 美东)

填表啊,把每个人的STATUS填上去

【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 他有这么一个table,这是起始条件。接下来怎么做,这就是他来问的问题。你打算怎
: 么做?



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 38.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 16 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Fri Dec 11 21:55:51 2020, 美东)

嗯,有多种方法,能做出来就行。

【 在 smallburrito (smallburrito) 的大作中提到: 】
: 填表啊,把每个人的STATUS填上去




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
smallburrito
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 17 ]

发信人: smallburrito (smallburrito), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Mon Dec 14 12:16:56 2020, 美东)

这种EVENT的LOG TABLE就是流水帐子,
MEANINGFUL的是个人的STATUS TABLE,
如果不想保留这个TABLE,那就在STORED PROCEDURE
BUILD TEMP TABLE,每次QUERY这个TABLE容易多了

【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 嗯,有多种方法,能做出来就行。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 38.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 18 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Mon Dec 14 12:55:47 2020, 美东)

属实。

这种event log table,或者叫journal table,transaction table,是业务运行table
。它方便写,不方便读。

但是改成每天每个ID一条status记录,会产生大量冗余,因为ID status change是很少
的事件。所以改成range比较合适。

【 在 smallburrito (smallburrito) 的大作中提到: 】
: 这种EVENT的LOG TABLE就是流水帐子,
: MEANINGFUL的是个人的STATUS TABLE,
: 如果不想保留这个TABLE,那就在STORED PROCEDURE
: BUILD TEMP TABLE,每次QUERY这个TABLE容易多了




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
robustsong
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 19 ]

发信人: robustsong (莫非), 信区: Database
标  题: Re: 请教高手这种join怎么办?
发信站: BBS 未名空间站 (Fri Jun 18 15:44:23 2021, 美东)

非常感谢大家的帮忙。这个问题被公司的一个DBA解决了,但是方法没告诉我。不过已
经能把活干完了。
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 69.]

[分页:1 ]
[快速返回] [ 进入数据库讨论区] [返回顶部]
回复文章
标题:
内 容:

未名交友
将您的链接放在这儿

友情链接


 

Site Map - Contact Us - Terms and Conditions - Privacy Policy

版权所有,未名空间(mitbbs.com),since 1996