많은 Max/Count Q가 응답하는 것을 보았지만이 문제를 해결할 수는 없습니다. 두 테이블, 첫 번째 사람과 두 번째 result_sets가 있다고 가정 해 보겠습니다. 여기에는 다음과 같은 데이터가 포함됩니다.다른 SQL Max/Count Qestion
사람들 테이블, ID 및 성별 플래그 (다른 것들 중에서);
는p_id p_gen
1 1
2 1
3 0
4 1
5 0
5 1
RESULT_SET 테이블은 내가 영어로 수행하고 싶습니다 무엇
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 테이블의 경우 0 일 때 s_id를 무시합니다. group a_id col (총 17 개의 a_id 값, 0-16)은 각 s_id 값의 개수를 합산하지만 가장 높은 t_id를 가진 행만을 계산합니다. 따라서 두 개 이상의 행이 동일한 a_id & p_id를 갖는 경우 가장 높은 t_id를 가진 행만 계산하십시오. 위의 데이터 세트의 경우, 아래의 4가 동일한 p_id & a_id와 관련되어 있지만 t_id가 더 크므로 처음 4 개의 행은 무시됩니다. 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
문제가 더 복잡해지기 때문에 필자는 사람 테이블의 p_gen 열을 기준으로 데이터를 필터링하고 싶습니다. 즉 p_gen이 1 인 p_id에 대한 데이터 만 말합니다.
나는 설명하려고 애쓰는 것이 있으면 좋겠다. 분명히 나는 SQL보다 더 많이 SQL을 연구 할 필요가 있지만 며칠 동안 이미 이것을 붓고 (봤다가), 나는 정말로 도움이 될 수있다.
너무 단순하지 않기를 바랍니다.
건배,
나의 사과 나는 다니엘 B (@ 다니엘-B?)에 회신 수 있도록 응답을 편집하는 방법을 정말 잘 모르겠어요으로는, 쿼리 내가 ingnore하려면 0을 포함 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 명으로 0 일 때 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
이제 완전히 무슨 일이 일어나는지 이해하기 위해 연구해야합니다.다시 한번 감사 다니엘 B.
DBMS는 SQL Server (2008 R2)입니다. 찾고 Thnks. – user3115420