sql - SQL 分组依据和日期间隔
问题描述
我有两个这样的表:
TABLE1 (SENDS)
------------------------------------------------
| ReceiptId | JobId | SK | LogDate |
|-----------|-------|------|---------------------|
| 0000001 | 67789 | 4151 | 6/4/2018 2:31:44 AM |
|-----------|-------|------|---------------------|
| 0000002 | 67789 | 4151 | 6/4/2018 8:25:50 AM |
|-----------|-------|------|---------------------|
| 0000003 | 67789 | 4151 | 6/4/2018 7:42:09 PM |
------------------------------------------------
TABLE2 (CLICKS)
------------------------------------
| JobId | SK | LogDate |
|-------|------|---------------------|
| 67789 | 4151 | 6/4/2018 4:51:23 AM |
|-------|------|---------------------|
| 67789 | 4151 | 6/4/2018 5:32:52 AM |
|-------|------|---------------------|
| 67789 | 4151 | 6/4/2018 7:12:03 AM |
|-------|------|---------------------|
| 67789 | 4151 | 6/4/2018 5:14:37 PM |
|-------|------|---------------------|
| 67789 | 4151 | 6/4/2018 6:07:12 PM |
|-------|------|---------------------|
| 67789 | 4151 | 6/4/2018 9:46:52 PM |
------------------------------------
我需要做一个 SQL 查询来提取ReceiptId
fromTABLE1
和记录的计数 where ( TABLE1.JobId = TABLE2.JobId
& TABLE1.SK = TABLE2.SK
) and TABLE2.LogDate
is between TABLE1.LogDate
and next high TABLE1.LogDate
.
所以这个例子的表格结果是:
RESULT TABLE
-----------------------------------------
| ReceiptId | JobId | SK | Clicks Count |
|-----------|-------|------|--------------|
| 0000001 | 67789 | 4151 | 3 |
|-----------|-------|------|--------------|
| 0000002 | 67789 | 4151 | 2 |
|-----------|-------|------|--------------|
| 0000003 | 67789 | 4151 | 1 |
-----------------------------------------
非常感谢您提前。
解决方案
似乎您想离开加入clicks
,sends
然后过滤logdate
and 使用GROUP BY
and count()
。
但是您的描述和您想要的示例输出彼此不一致。
因此,以下内容得到了您的描述:
SELECT s.receiptid,
s.jobid,
s.sk,
count(*)
FROM sends s
LEFT JOIN clicks c
ON c.jobid = s.jobid
AND c.sk = s.sk
WHERE c.logdate >= s.logdate
AND c.logdate <= (SELECT min(ss.logdate)
FROM sends ss
WHERE ss.logdate > s.logdate
AND ss.jobid = s.jobid
AND ss.sk = s.sk)
GROUP BY s.receiptid,
s.jobid,
s.sk;
以下得到您想要的示例输出:
SELECT s.receiptid,
s.jobid,
s.sk,
count(*)
FROM sends s
LEFT JOIN clicks c
ON c.jobid = s.jobid
AND c.sk = s.sk
WHERE c.logdate >= s.logdate
AND c.logdate <= coalesce((SELECT min(ss.logdate)
FROM sends ss
WHERE ss.logdate > s.logdate
AND ss.jobid = s.jobid
AND ss.sk = s.sk),
c.logdate)
GROUP BY s.receiptid,
s.jobid,
s.sk;
推荐阅读
- c# - 如何使用 C# 通过他的 ID 获取当前登录的用户?
- html - 如何在 Angular 的对话框中显示输入更改?
- javascript - 如何检索包含特定字符串的特定对象
- autocad - 运行 AutoLISP 文件的脚本
- linux - 当accept() 失败且不是EAGAIN 或EWOULDBLOCK(非阻塞IO)时该怎么办?
- tensorflow - 经过一段时间的训练,训练损失值在增加,但模型检测到的对象很好
- c# - ASP.net 核心 RegularException 属性 - 多个条件
- c# - 为什么我不能在构造函数中设置这个只读属性?
- javascript - 使用 lodash 对翻转函数进行柯里化 - 有限制吗?
- coq - 在 Coq 中匹配假设的更短的符号?