我有一個數據集,它基本上由作業批次列表,每個批次中包含的作業數量以及每個作業批處理的持續時間組成。這裏是一個示例數據集:另一種百分位數方法?
CREATE TABLE test_data
(
batch_id NUMBER,
job_count NUMBER,
duration NUMBER
);
INSERT INTO test_data VALUES (1, 37, 9);
INSERT INTO test_data VALUES (2, 47, 4);
INSERT INTO test_data VALUES (3, 66, 6);
INSERT INTO test_data VALUES (4, 46, 6);
INSERT INTO test_data VALUES (5, 54, 1);
INSERT INTO test_data VALUES (6, 35, 1);
INSERT INTO test_data VALUES (7, 55, 9);
INSERT INTO test_data VALUES (8, 82, 7);
INSERT INTO test_data VALUES (9, 12, 9);
INSERT INTO test_data VALUES (10, 52, 4);
INSERT INTO test_data VALUES (11, 3, 9);
INSERT INTO test_data VALUES (12, 90, 2);
現在,我想計算持續時間字段的一些百分點。通常,這與像做了以下內容:
SELECT
PERCENTILE_DISC(0.75)
WITHIN GROUP (ORDER BY duration ASC)
AS third_quartile
FROM
test_data;
(其中給出的9結果)
我在這裏的問題是,我們不希望基於批拿到百分,我想讓他們基於個人工作。我可以用手很容易地通過生成運行總job_count的數字了這一點:
SELECT
batch_id,
job_count,
SUM(
job_count
)
OVER (
ORDER BY duration
ROWS UNBOUNDED PRECEDING
)
AS total_jobs,
duration
FROM
test_data
ORDER BY
duration ASC;
BATCH_ID JOB_COUNT TOTAL_JOBS DURATION
6 35 35 1
5 54 89 1
12 90 179 2
2 47 226 4
10 52 278 4
3 66 344 6
4 46 390 6
8 82 472 7
9 12 484 9
1 37 521 9
11 3 524 9
7 55 579 9
因爲我有579點的工作,那麼第75百分位數將工作434綜觀上述結果集,與對應持續時間爲7,與標準功能不同。
從本質上講,我要考慮一個批處理作爲一個單獨的觀察每個作業,並基於這些百分位數,而不是在批次。
有一個比較簡單的方法來做到這一點?
你的意思是你要尋找的「'每job'」時間?如果是這樣,可以使用'duration/job_count'作爲衡量標準嗎?請澄清你的要求。你的第二種方法沒有太大意義(至少在數學上)。 – 2013-05-08 22:17:13
雖然正確,但仍然存在問題。 (我已經省略,爲簡單起見在模擬數據) 如果我這樣做,然後從上面的數據集所報告的第75百分位數是0.16,但所期望的第75百分位應該是0.13,因爲它是基於批次而不是仍然確定第75個百分工作。 – emiller42 2013-05-08 22:27:26
另外值得注意的是,在批處理完成之前,批處理中的任何作業都將被視爲完成。所以從最終用戶的角度來看,一批中的所有工作都需要相同的時間。 – emiller42 2013-05-08 22:31:06