[英]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.callDate
的callNumber
。
Example data from HistoricCall
:来自
HistoricCall
的示例数据:
projectId![]() |
caseId![]() |
callNumber![]() |
callDate![]() |
---|---|---|---|
100018 ![]() |
0000000001 ![]() |
1 ![]() |
2014-09-11 16:32:11.000 ![]() |
100018 ![]() |
0000000001 ![]() |
2 ![]() |
2014-09-11 20:43:01.000 ![]() |
100018 ![]() |
0000000001 ![]() |
3 ![]() |
2014-09-12 21:09:55.000 ![]() |
100018 ![]() |
0000000001 ![]() |
4 ![]() |
2014-09-13 14:58:14.000 ![]() |
100018 ![]() |
0000000001 ![]() |
5 ![]() |
2014-09-14 16:42:27.000 ![]() |
100018 ![]() |
0000000001 ![]() |
6 ![]() |
2014-09-16 21:54:09.000 ![]() |
100018 ![]() |
0000000001 ![]() |
7 ![]() |
2014-09-16 22:30:24.000 ![]() |
100018 ![]() |
0000000002 ![]() |
1 ![]() |
2014-09-11 16:36:17.000 ![]() |
100018 ![]() |
0000000002 ![]() |
2 ![]() |
2014-09-13 18:05:44.000 ![]() |
100018 ![]() |
0000000002 ![]() |
3 ![]() |
2014-09-14 16:39:03.000 ![]() |
Example data from Responses
:来自
Responses
的示例数据:
projectId![]() |
caseId![]() |
cellmap![]() |
---|---|---|
637850 ![]() |
0000000001 ![]() |
9101 ![]() |
637850 ![]() |
0000000002 ![]() |
9052 ![]() |
637850 ![]() |
0000000003 ![]() |
5071 ![]() |
637850 ![]() |
0000000004 ![]() |
5173 ![]() |
637850 ![]() |
0000000005 ![]() |
|
637850 ![]() |
0000000006 ![]() |
8062 ![]() |
637850 ![]() |
0000000007 ![]() |
0012 ![]() |
637850 ![]() |
0000000008 ![]() |
5292 ![]() |
637850 ![]() |
0000000009 ![]() |
9230 ![]() |
637850 ![]() |
0000000010 ![]() |
5187 ![]() |
What I'm hoping for is something like this:我希望是这样的:
projectId![]() |
callDate![]() |
cellmap![]() |
Count![]() |
---|---|---|---|
637850 ![]() |
2014-09-11 ![]() |
0012 ![]() |
3 ![]() |
637850 ![]() |
2014-09-11 ![]() |
0014 ![]() |
7 ![]() |
637850 ![]() |
2014-09-12 ![]() |
0012 ![]() |
4 ![]() |
637850 ![]() |
2014-09-12 ![]() |
0014 ![]() |
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 根据上面的示例递增,因此无需进行计数。
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.