简体   繁体   English

基于另一列的 MAX 连接基于两列的表

[英]Joining tables based on two columns based on MAX for another column

I have a table HistoricCall and another Responses .我有一个表HistoricCall和另一个Responses Both tables can be joined using the query below:可以使用以下查询连接两个表:

SELECT *
FROM HistoricCall h
INNER JOIN Responses r ON h.projectid = r.projectId 
                       AND h.caseId = r.caseId

The HistoricCall table has a column for number of attempts for each time that we've called someone ( h.callNumber ). HistoricCall表有一列用于记录我们每次呼叫某人的尝试次数 ( h.callNumber )。

I'm trying to write a query that would display:我正在尝试编写一个显示如下的查询:

SELECT 
    h.callDate,
    r.cellmap,
    COUNT(*)

...but only displays the h.callDate that corresponds to the highest callNumber for each record. ...但仅显示对应于每条记录的最高h.callDatecallNumber

Example data from HistoricCall :来自HistoricCall的示例数据:

projectId项目编号 caseId案例ID callNumber电话号码 callDate通话日期
100018 100018 0000000001 0000000001 1 1 2014-09-11 16:32:11.000 2014-09-11 16:32:11.000
100018 100018 0000000001 0000000001 2 2 2014-09-11 20:43:01.000 2014-09-11 20:43:01.000
100018 100018 0000000001 0000000001 3 3 2014-09-12 21:09:55.000 2014-09-12 21:09:55.000
100018 100018 0000000001 0000000001 4 4 2014-09-13 14:58:14.000 2014-09-13 14:58:14.000
100018 100018 0000000001 0000000001 5 5 2014-09-14 16:42:27.000 2014-09-14 16:42:27.000
100018 100018 0000000001 0000000001 6 6 2014-09-16 21:54:09.000 2014-09-16 21:54:09.000
100018 100018 0000000001 0000000001 7 7 2014-09-16 22:30:24.000 2014-09-16 22:30:24.000
100018 100018 0000000002 0000000002 1 1 2014-09-11 16:36:17.000 2014-09-11 16:36:17.000
100018 100018 0000000002 0000000002 2 2 2014-09-13 18:05:44.000 2014-09-13 18:05:44.000
100018 100018 0000000002 0000000002 3 3 2014-09-14 16:39:03.000 2014-09-14 16:39:03.000

Example data from Responses :来自Responses的示例数据:

projectId项目编号 caseId案例ID cellmap细胞图
637850 637850 0000000001 0000000001 9101 9101
637850 637850 0000000002 0000000002 9052 9052
637850 637850 0000000003 0000000003 5071 5071
637850 637850 0000000004 0000000004 5173 5173
637850 637850 0000000005 0000000005
637850 637850 0000000006 0000000006 8062 8062
637850 637850 0000000007 0000000007 0012 0012
637850 637850 0000000008 0000000008 5292 5292
637850 637850 0000000009 0000000009 9230 9230
637850 637850 0000000010 0000000010 5187 5187

What I'm hoping for is something like this:我希望是这样的:

projectId项目编号 callDate通话日期 cellmap细胞图 Count数数
637850 637850 2014-09-11 2014-09-11 0012 0012 3 3
637850 637850 2014-09-11 2014-09-11 0014 0014 7 7
637850 637850 2014-09-12 2014-09-12 0012 0012 4 4
637850 637850 2014-09-12 2014-09-12 0014 0014 2 2

I hope this makes sense and I appreciate your time.我希望这是有道理的,我很感激你的时间。

You can convert the celldate to date from datetime and simple group by should work.您可以将 celldate 从 datetime 转换为 date 并且简单的 group by 应该可以工作。

SELECT 
    Max(h.projectid) projectid, -- if you need project id of call you can also include it in the group by clause
    h.callDate,
    r.cellmap,
    COUNT(*)
FROM HistoricCall h
INNER JOIN Responses r ON h.projectid = r.projectId 
                       AND h.caseId = r.caseId
group by cast(h.callDate as date), r.cellmap   

You can create a join using a subquery to get the max callNumber by projectId and caseId grouping.您可以使用子查询创建连接,以通过 projectId 和 caseId 分组获取最大 callNumber。 There's no need to do a count since the callNumber is incremented according to your example above.由于 callNumber 根据上面的示例递增,因此无需进行计数。

Fiddle for reference 提琴供参考

SELECT h.projectId              AS "projectId",
       cast(h.callDate AS date) AS "callDate", --cast as date
       r.cellmap                AS "cellmap",
       m.maxCall                AS "Count"
FROM   HistoricCall h
       INNER JOIN Responses r
               ON h.projectid = r.projectId
                  AND h.caseId = r.caseId
       INNER JOIN (SELECT projectid,
                          caseId,
                          max(callNumber) maxCall --get max call number
                   FROM   HistoricCall
                   GROUP  BY projectid,
                             caseId) m
               ON h.projectId = m.projectId
                  AND h.caseId = m.caseId
                  AND h.callNumber = m.maxCall
WHERE  r.cellmap IS NOT NULL --remove if empty cellmap values can be included
GROUP  BY h.projectId,
          cast(h.callDate AS date),
          r.cellmap,
          m.maxCall
ORDER  BY h.projectId,
          cast(h.callDate AS date),
          r.cellmap ASC 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM