2017-12-12 3 views
1

Firebird 데이터베이스를 사용하고 있지만 대부분의 다른 데이터베이스 엔진의 SQL 구문을 사용하여 응답 할 수도 있습니다.group by을 (를) 사용하고 distinct를 선택하는 방법

WORKER 
workerid: integer 
worker names and so ot. 

LOGEVENT 
logeventid: integer 
logday: integer 
workerid: integer 

따라서 LOGEVENT 테이블은 작업자 로그인을 추적하는 데 사용됩니다 :

나는 두 개의 테이블이있다. 그리고 간단히하기 위해 여기서 logday는 로그인 일을 나타내는 정수로 사용합니다. 예를 들어, 전형적인 로그 테이블처럼 보일 수 1 따라서 365

에 올해의 날이 될 수 있습니다 : ID로 작업자를 알 수있는 바와 같이

logeventid logday  workerid 
1   5   3 
2   5   4 
3   5   3 
4   5   7 
5   6   4 
6   6   3 
7   6   4 

= 3 5 일에 두 로그인을했다 .

이제는 일일 총 로그인 수를 생성하는 SQL 쿼리를 작성해야합니다 (같은 요일에 같은 작업자가 여러 번 로그인 한 경우 하나의 이벤트로 계산해야 함).

다음 쿼리 :

select count(logeventid) as logincount, logday from logevent 
group by logday 
order by logday 

는 5 일 대한 logincount = 4가 표시됩니다. 왜냐하면 그것은 id = 3 인 근로자를 두 번 계산했기 때문입니다. 나는 분명히 뚜렷한 노동자 로그인 만해야합니다. 따라서 5 일 동안 3 번의 로그인 만 생성하는 쿼리가 필요합니다.

+0

질문을 재조정해야합니다. "고유 한 로그인 이벤트"는 정확히 "A. van Esveld"가 말한 것입니다. 동일한 또는 다른 사람이 문을 몇 번 지나쳤습니다. 문이 열릴 때마다 - 그것은 독특한 사건입니다. 당신이 필요로하는 것은 고유 로그인 이벤트 대신 하루에 얼마나 많은 다른 직원이 로그인했는지를 나타내는 것입니다. LiveJournal의 "social capital" –

+0

나는 질문이 명확하게 설명되지 않았 음에 동의합니다. 그러나 나는 그 모범을 보였다. 예, 일일 총 로그인 수를 계산해야하지만 각 작업자는 하루에 한 번만 계산해야합니다. (이것은 두 번째 변형에서 "하루에 얼마나 많은 다른 직원이 로그인했는지"에서 잘 설명한 것입니다.). –

+0

그런 다음 Q를 편집하고 다시 단어를 바꿔서 나중에 다른 사람들이 Google을 찾아서 찾을 수 있습니다 :-D –

답변

0
select count(logeventid) as logincount, logday from logevent 
group by logday, workerid 
order by logday 

workerid의 추가 그룹은 이중 로그인을 제거해야합니다.

+0

나는 그룹별로 workerid를 추가하는 것에 대해서도 알고 있습니다. 처음에는 (질문하기 전에) 나는 logday 앞에 다음과 같이 추가했다 : workerid, logday에 의한 그룹. 그런데 당신의 변종을 시험해 보았습니다 : group by logday, workerid. 하지만 두 변형 모두 작동하지 않습니다. 동일한 결과를 산출합니다. –

3

당신은 하루에 고유 한 사용자 수를 계산하려면 :

select logday, count(distinct workerid) as logincount 
from logevent 
group by logday 
order by logday; 
+0

Thorsten, 답변 해 주셔서 대단히 감사합니다. 그것은 일했다! 어딘가에서 별개의 wokerid를 사용하는 것에 대해 생각했습니다. 하지만 count()에 직접 넣을 수 있는지 몰랐습니다. –

+0

@RomanVasin Firebird 언어 참고서를 읽는 것이 좋습니다. 예를 들어, ['count'] (https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-functions-aggfuncs.html) # fblangref25-functions-aggfuncs-count) –

2

당신은 하루에 별개의 workerids를 계산합니다. 그래서 당신은이 쿼리가 필요합니다 :

select count(DISTINCT workerid) as logincount, logday from logevent 
group by logday 
order by logday 
+0

고맙습니다. 그것은 효과가있었습니다. 같은 대답이 Thorsten에게 묻습니다. –

관련 문제