已经看到很多Max / Count Qs已经回答,但是我无法理解这个问题。假设我有两个表,第一个人和第二个result_sets。它们包含如下数据;
人员表,身份证和性别标志(以及其他);
p_id p_gen
1 1
2 1
3 0
4 1
5 0
5 1
result_set table
r_id p_id a_id s_id t_id
1 1 0 5 0
2 1 1 5 0
3 1 2 5 0
4 1 3 5 0
18 1 0 6 1
19 1 1 6 1
20 1 2 5 1
21 1 3 6 1
52 4 0 5 0
53 4 1 5 0
54 4 2 5 0
55 4 3 5 0
69 4 0 5 1
70 4 1 6 1
71 4 2 6 1
72 4 3 5 1
103 5 0 5 0
104 5 1 5 0
111 5 8 6 0
112 5 9 6 0
113 5 10 5 0
120 5 0 6 1
121 5 1 6 1
128 5 8 6 1
129 5 9 6 1
130 5 10 6 1
137 5 0 6 2
138 5 1 6 2
145 5 8 7 2
146 5 9 6 2
147 5 10 7 2
205 2 0 5 0
206 2 1 5 0
207 2 2 5 0
我想用英语做的事情是这样的;
关于result_set表,忽略s_id为零。 a_id col上的group(总共有17个a_id值,0-16)总计他们拥有的每个s_id值的数量,但只计算具有最高t_id的行。因此,如果2行或更多行具有相同的a_id& p_id,只计算具有最高t_id的那个。因此,对于上述数据集,前4行将被忽略,因为下面的4与相同的p_id& a_id但有更大的t_id。由于相同的原因,将不计算第9-12行,并且由于相同的原因忽略第17-26行,即第27-31行具有更高的p_id。显示的最后3行将被计算在内。
所以,我想返回(从上面的数据);
a_id s_id Qty
0 5 2
0 6 2
1 5 1
1 6 3
2 5 5
2 6 1
3 5 1
3 6 1
8 7 1
9 6 1
10 7 1
为了使问题更加复杂,我想根据people表的p_gen列过滤数据。即,只有p_id的数据,其中p_gen是1,比如说。
我希望我遇到过我想要解释的内容。显然我需要比我更多地研究SQL,但是已经倾倒了(并用Google搜索)了几天,我真的可以帮忙。
我希望这不是太简单!
干杯,
我很抱歉,因为我不确定如何编辑回复所以在回复Daniel B(@ daniel-b?)时,您的查询返回了包含零的s_id值,我想要忽略它们并省略其他应该的s_id值在那里。可能我没有做好解释。无论如何,使用我的实际数据,您的查询返回;
a_id s_id Qty
===================
0 0 14
0 6 1
1 0 14
1 6 1
2 0 14
2 5 1
3 0 14
3 6 1
4 0 14
4 6 1
5 0 14
5 6 1
6 0 14
6 6 1
7 0 14
7 6 1
8 0 14
8 7 1
等等......
这比我的方式更接近。存在所有17个a_id值,并且每个a_id(14 + 1)的总s_id值是核心的,因为有15个人但是s_id值为零不应该存在且更多的值应该是5。我会看看我是否能找出遗漏的东西。
干杯,
编辑#2,成功!
非常感谢Daniel B,他为我提供了急需的答案(没有多少头发留下)。 Daniel B提供的查询的一个非常轻微的推文(可能是因为我无法正确解释),即将s_id过滤器(WHERE s_id<> 0)移动到子查询中已经完成了这一操作。结果就是这样;
SELECT rs.a_id, rs.s_id, COUNT(rs.s_id) Qty
FROM result_set rs
INNER JOIN
(SELECT p_id, a_id, MAX(t_id) t_id FROM result_set WHERE s_id <> 0 GROUP BY p_id, a_id) X
ON rs.p_id=X.p_id AND rs.a_id=X.a_id AND rs.t_id = X.t_id
INNER JOIN people p ON p.p_id = rs.p_id
WHERE p.p_gen = 1
GROUP BY rs.a_id, rs.s_id
Order by a_id
我现在需要研究它以充分了解正在发生的事情。再次感谢Daniel B.
答案 0 :(得分:0)
试试这个:
SELECT rs.a_id, rs.s_id, COUNT(rs.s_id)
FROM result_set rs
INNER JOIN
(SELECT p_id, a_id, MAX(t_id) t_id FROM result_set GROUP BY p_id, a_id) X
ON rs.p_id=X.p_id AND rs.a_id=X.a_id AND rs.t_id = X.t_id
INNER JOIN people p ON p.p_id = rs.p_id
WHERE p.p_gen = @Gender_Variable
AND NOT rs.s_id = 0
GROUP BY rs.a_id, rs.s_id
要进行subselect的内部联接只包含每个p_id和a_id的最高t_id。