另一个SQL Max / Count问题

时间:2013-12-18 18:02:31

标签: sql sql-server-2008 count max

已经看到很多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.

1 个答案:

答案 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。