首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL group by和日期间隔

SQL group by和日期间隔
EN

Stack Overflow用户
提问于 2018-06-07 20:00:06
回答 1查看 62关注 0票数 1

我有两个这样的表:

                  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查询来从TABLE1中提取ReceiptId,其中(TABLE1.JobId = TABLE2.JobId & TABLE1.SK = TABLE2.SK)和TABLE2.LogDate的记录数介于TABLE1.LogDate和下一个最高的TABLE1.LogDate之间。

因此,此示例的表结果为:

           RESULT TABLE
 -----------------------------------------
| ReceiptId | JobId |  SK  | Clicks Count |
|-----------|-------|------|--------------|
| 0000001   | 67789 | 4151 |      3       |
|-----------|-------|------|--------------|
| 0000002   | 67789 | 4151 |      2       |
|-----------|-------|------|--------------|
| 0000003   | 67789 | 4151 |      1       |
 -----------------------------------------

非常提前感谢您。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-07 20:26:57

您似乎想要将clicks连接到sends,然后对logdate进行过滤,并使用GROUP BYcount()

但是你的描述和你想要的样本输出彼此不一致。

因此,下面就得到了你所描述的内容:

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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50740661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档