이 당신의 작업에이 코드를 적용하는 것을 시도하십시오 -
CREATE TABLE visits(
user_id INT(11) NOT NULL,
dt DATETIME DEFAULT NULL
);
INSERT INTO visits VALUES
(1, '2011-06-30 12:11:46'),
(1, '2011-07-01 13:16:34'),
(1, '2011-07-01 15:22:45'),
(1, '2011-07-01 22:35:00'),
(1, '2011-07-02 13:45:12'),
(1, '2011-08-01 00:11:45'),
(1, '2011-08-05 17:14:34'),
(1, '2011-08-05 18:11:46'),
(1, '2011-08-06 20:22:12'),
(2, '2011-08-30 16:13:34'),
(2, '2011-08-31 16:13:41');
SET @i = 0;
SET @last_dt = NULL;
SET @last_user = NULL;
SELECT v.user_id,
COUNT(DISTINCT(DATE(dt))) number_of_days,
MAX(days) number_of_visits
FROM
(SELECT user_id, dt
@i := IF(@last_user IS NULL OR @last_user <> user_id, 1, IF(@last_dt IS NULL OR (DATE(dt) - INTERVAL 1 DAY) > DATE(@last_dt), @i + 1, @i)) AS days,
@last_dt := DATE(dt),
@last_user := user_id
FROM
visits
ORDER BY
user_id, dt
) v
GROUP BY
v.user_id;
----------------
Output:
+---------+----------------+------------------+
| user_id | number_of_days | number_of_visits |
+---------+----------------+------------------+
| 1 | 6 | 3 |
| 2 | 2 | 1 |
+---------+----------------+------------------+
설명 :
그것의 하위 쿼리를 확인하게 작동 방식을 이해하기를, 여기있다.
SET @i = 0;
SET @last_dt = NULL;
SET @last_user = NULL;
SELECT user_id, dt,
@i := IF(@last_user IS NULL OR @last_user <> user_id, 1, IF(@last_dt IS NULL OR (DATE(dt) - INTERVAL 1 DAY) > DATE(@last_dt), @i + 1, @i)) AS
days,
@last_dt := DATE(dt) lt,
@last_user := user_id lu
FROM
visits
ORDER BY
user_id, dt;
이 쿼리는 모든 행을 반환하고 방문수에 대한 순위를 지정합니다. 이것은 변수를 기반으로하는 알려진 순위 방법입니다. 행은 사용자 및 날짜 필드별로 정렬됩니다. 'COUNT (DISTINCT (DATE (:
+---------+---------------------+------+------------+----+
| user_id | dt | days | lt | lu |
+---------+---------------------+------+------------+----+
| 1 | 2011-06-30 12:11:46 | 1 | 2011-06-30 | 1 |
| 1 | 2011-07-01 13:16:34 | 1 | 2011-07-01 | 1 |
| 1 | 2011-07-01 15:22:45 | 1 | 2011-07-01 | 1 |
| 1 | 2011-07-01 22:35:00 | 1 | 2011-07-01 | 1 |
| 1 | 2011-07-02 13:45:12 | 1 | 2011-07-02 | 1 |
| 1 | 2011-08-01 00:11:45 | 2 | 2011-08-01 | 1 |
| 1 | 2011-08-05 17:14:34 | 3 | 2011-08-05 | 1 |
| 1 | 2011-08-05 18:11:46 | 3 | 2011-08-05 | 1 |
| 1 | 2011-08-06 20:22:12 | 3 | 2011-08-06 | 1 |
| 2 | 2011-08-30 16:13:34 | 1 | 2011-08-30 | 2 |
| 2 | 2011-08-31 16:13:41 | 1 | 2011-08-31 | 2 |
+---------+---------------------+------+------------+----+
그럼 우리 그룹이 데이터를 사용자가 설정 집계 함수를 사용 - 데이터가 days
열이 방문 횟수에 대한 순위를 제공하는 경우 설정 옆에이 쿼리는 사용자가 방문, 출력을 계산 dt))) - 일수를 계산합니다. 'MAX (일)'- 방문수로, 하위 쿼리의 days
필드의 최대 값입니다. 모든 인
; Devart 의해 제공된 데이터 샘플로)
의 Devart 데이터 세트 당 최종 정확한 결과를 계산 ... 나는 그것이 가능 ... 완전히 제안을 이해할 수없는 것 좀 더 자세한 내용을 알려주시겠습니까? 고맙습니다! 두 번째 질문에 관해서는 제 질문에서 언급 한 것처럼 사용자와 도시를 세지 않는다면 제 질문은 옳습니다. – linkyndy
죄송합니다. "사용자가 한 도시에 며칠 동안"에 대한 결과가 (user_id, count_of_days)와 같아야한다고 가정했습니다. – Simon
감사합니다. 내 실제 데이터베이스 테이블에 맞게 여러 가지 조정을하면 쿼리가 매력처럼 작동합니다. 다시 감사합니다! – linkyndy