문제

사용자당 약 3000개의 행이 있는 MySQL 테이블이 있습니다.열 중 하나는 변경 가능한 날짜/시간 필드이므로 행이 시간순으로 정렬되지 않습니다.

시간 분포를 차트로 시각화하고 싶기 때문에 개별 데이터 포인트가 많이 필요합니다.20개의 데이터 포인트이면 충분합니다.

나는 이것을 할 수 있습니다 :

select timefield from entries where uid = ? order by timefield;

매 150번째 행을 살펴보세요.

아니면 20개의 개별 쿼리를 수행하고 limit 1 그리고 offset.

하지만 더 효율적인 솔루션이 있어야 합니다...

도움이 되었습니까?

해결책

Michal Sznajder는 거의 그랬지만 SQL의 WHERE 절에서는 열 별칭을 사용할 수 없습니다.따라서 파생 테이블로 래핑해야 합니다.나는 이것을 시도했고 20개의 행을 반환했습니다.

SELECT * FROM (
    SELECT @rownum:=@rownum+1 AS rownum, e.*
    FROM (SELECT @rownum := 0) r, entries e) AS e2
WHERE uid = ? AND rownum % 150 = 0;

다른 팁

이런 내용이 떠올랐어요

select @rownum:=@rownum+1 rownum, entries.* 
from (select @rownum:=0) r, entries 
where uid = ? and rownum % 150 = 0

내 손에는 MySQL이 없지만 이것이 도움이 될 것입니다 ...

시각화에 관해서는 이것이 귀하가 말하는 주기적 샘플링이 아니라는 것을 알고 있지만 사용자의 모든 행을 보고 간격 버킷, 버킷 내의 SUM을 선택하고 막대 그래프 또는 이와 유사한 것으로 표시합니다.일정 기간 내에 많은 발생이 중요할 수 있으므로 이는 실제 "분포"를 보여줍니다.

SELECT DATEADD(day, DATEDIFF(day, 0, timefield), 0) AS bucket -- choose an appropriate granularity (days used here)
     ,COUNT(*)
FROM entries
WHERE uid = ?
GROUP BY DATEADD(day, DATEDIFF(day, 0, timefield), 0)
ORDER BY DATEADD(day, DATEDIFF(day, 0, timefield), 0)

또는 스스로 반복해야 하는 방식이 마음에 들지 않거나 다른 버킷을 사용하여 많은 사용자를 3차원으로 분석하려는 경우(x, y uid, 버킷에 대해 Z 단위로 측정):

SELECT uid
    ,bucket
    ,COUNT(*) AS measure
FROM (
    SELECT uid
        ,DATEADD(day, DATEDIFF(day, 0, timefield), 0) AS bucket
    FROM entries
) AS buckets
GROUP BY uid
    ,bucket
ORDER BY uid
    ,bucket

3D로 플롯하려는 경우 사용자에 대한 의미 있는 전체 측정항목에 따라 사용자의 순서를 지정하는 방법을 결정할 것입니다.

@미칼

어떤 이유로 든 귀하의 예제는 @recnum이 보다 작은 연산자를 사용하는 경우에만 작동합니다.행을 필터링하는 위치에서 rownum이 증가하지 않고 다른 것과 일치할 수 없다고 생각합니다.

원본 테이블에 자동 증가 ID 열이 있고 행이 시간순으로 삽입된 경우 다음이 작동합니다.

select timefield from entries
where uid = ? and id % 150 = 0 order by timefield;

물론, ID와 시간 필드 사이에 상관 관계가 없으면 작동하지 않습니다. 실제로 균일한 간격의 시간 필드를 가져오는 데 관심이 없으면 무작위로 20개만 사용하면 됩니다.

개별 데이터 포인트에 정말로 관심이 있으신가요?아니면 날짜에 대한 통계 집계 함수를 사용하면 알고 싶은 내용을 충분히 알 수 있습니까?

select timefield
from entries
where rand() = .01 --will return 1% of rows adjust as needed.

mysql 전문가가 아니기 때문에 이 환경에서 rand()가 어떻게 작동하는지 잘 모르겠습니다.

참고로 - 그리고 postgres를 사용하는 사람들을 위해 - Postgres 9.4에서는 이 문제를 해결하는 집합 집계를 주문했습니다.

SELECT percentile_disc(0.95) 
WITHIN GROUP (ORDER BY response_time) 
FROM pageviews;

원천: http://www.craigkerstiens.com/2014/02/02/Examineing-PostgreSQL-9.4/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top