2008-08-06 39 views
11

Tôi có bảng MySQL với khoảng 3000 hàng cho mỗi người dùng. Một trong các cột là trường ngày giờ, có thể thay đổi, do đó các hàng không theo thứ tự thời gian.Phân phối bảng trong thời gian

Tôi muốn hình dung thời gian phân phối trong biểu đồ, vì vậy tôi cần một số điểm dữ liệu riêng lẻ. 20 datapoints sẽ là đủ.

tôi có thể làm điều này:

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

và nhìn vào mỗi hàng thứ 150.

Hoặc tôi có thể thực hiện 20 truy vấn riêng biệt và sử dụng limit 1offset.

Nhưng có phải là một giải pháp hiệu quả hơn ...

+0

bạn có thể mô tả các câu hỏi một chút? Đầu ra bạn đang tìm kiếm là gì? Bạn có muốn xem biểu đồ tần suất (ví dụ: số lượng mục nhập trong Jan = 132, Feb = 112, Mar = 173, v.v.) hay bạn muốn các giá trị riêng lẻ của mục nhập sớm nhất, mục nhập sớm nhất thứ 150, số 300, v.v. – nickf

Trả lời

6

Michal Sznajder gần như đã có nó, nhưng bạn không thể sử dụng bí danh cột trong mệnh đề WHERE trong SQL. Vì vậy, bạn phải quấn nó như là một bảng có nguồn gốc. Tôi cố gắng này và nó sẽ trả về 20 hàng:

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

Something như thế này lóe lên trong óc tôi

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

Tôi không có MySQL trong tầm tay của tôi, nhưng có lẽ điều này sẽ giúp ...

0

@Michal

Đối với bất cứ lý do, ví dụ của bạn chỉ hoạt động khi các @recnum nơi sử dụng dưới điều hành. Tôi nghĩ rằng khi các bộ lọc ra khỏi một hàng, các rownum không nhận được tăng lên, và nó không thể phù hợp với bất cứ điều gì khác.

Nếu bảng ban đầu có một tự động tăng lên cột id, và các hàng được chèn vào trong thứ tự thời gian, sau đó điều này sẽ làm việc:

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

Dĩ nhiên điều đó không làm việc nếu không có sự tương quan giữa id và khoảng thời gian, trừ khi bạn không thực sự quan tâm đến việc nhận được khoảng thời gian đồng đều, chỉ có 20 khoảng thời gian ngẫu nhiên.

0

Bạn có thực sự quan tâm đến các điểm dữ liệu riêng lẻ không? Hoặc sẽ sử dụng các hàm tổng hợp thống kê trên số ngày thay vì đủ để cho bạn biết những gì bạn muốn biết?

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

Không phải là một chuyên gia mysql vì vậy tôi không chắc chắn cách rand() hoạt động trong môi trường này.

+0

phải là "rand() <.01" – nickf

1

Theo như hình dung, tôi biết đây không phải là lấy mẫu định kỳ bạn đang nói về, nhưng tôi sẽ xem xét tất cả các hàng cho một người sử dụng và chọn một xô khoảng , SUM trong các nhóm và hiển thị trên biểu đồ thanh hoặc tương tự. Điều này sẽ cho thấy một "phân phối" thực sự, vì nhiều lần xuất hiện trong một khung thời gian có thể là đáng kể.

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) 

Hoặc nếu bạn không thích cách bạn phải lặp lại chính mình - hoặc nếu bạn đang chơi với xô khác nhau và muốn phân tích trên nhiều người sử dụng trong 3-D (đo trong Z chống x, y uid , xô):

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 

Nếu tôi muốn vẽ trong 3-D, tôi có thể xác định cách đặt hàng người dùng theo một số chỉ số tổng thể có ý nghĩa cho người dùng.

+0

bạn có thể làm "GROUP BY bucket ORDER BY bucket" không? có vẻ như nó sẽ hiệu quả hơn nhiều (không phải tính toán lại cột đó mỗi lần) – nickf

+0

Không, bạn không thể, tuy nhiên, trình tối ưu hóa không thực sự tính lại các biểu thức đó, bởi vì nó biết rằng các hàm là xác định. –

0

Để tham khảo của tôi - và đối với những người sử dụng postgres - Postgres 9.4 sẽ đã ra lệnh thiết lập uẩn rằng nên giải quyết vấn đề này:

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

Nguồn: http://www.craigkerstiens.com/2014/02/02/Examining-PostgreSQL-9.4/

Các vấn đề liên quan