一點解釋:ROWNUMBER功能
我有一個表叫passes
和它與2個表(services
(cod_serv)和atend
(通過))鏈接。通票可以複製用於不同的服務。例如:如果我有3項服務,我可以有3次通行證,01,但是對於相同的服務(我在我的複合主鍵中定義它),不是2次通過1次。
對於測試,我添加了102個通行證(所有的情況=「F」和相同的日期(今天))。然後,我添加了每個服務的通行證(我有3個服務)。
以下查詢將顯示schema
如何定義或多或少。
SELECT DISTINCT s.pass, s.data, cod_serv, situation, hour, min
FROM passes
JOIN atend a ON s.pass = a.pass;
PASS DATA COD_SERV S HOUR MIN
----- -------- --------- - ------- -------
04 26/03/16 2 F 12 24
04 26/03/16 1 F 13 27
13 26/03/16 1 F 14 26
18 26/03/16 3 F 14 27
18 26/03/16 2 F 14 28
15 26/03/16 1 F 14 29
10 26/03/16 3 F 14 30
... ... ... ... ... ...
然後,我想從一個特定的日期與時間和最小的情況=「F」排序得到的第100(ROWNUMBER()
)通(因爲它顯示下面是21)。
行號100:
21 26/03/16 3 F 14 34
以下query
將返回什麼,我想不通爲什麼。順便說一下,我有超過100通過這種情況。
SELECT DISTINCT pass, data, cod_serv, situation FROM
(SELECT DISTINCT a.pass, s.data, cod_serv, situation,
ROW_NUMBER() OVER(PARTITION BY situation, hour, min
ORDER BY situation, hour, min) row
FROM passes s
JOIN atend a ON s.pass = a.pass
WHERE situation = 'F' AND
TRUNC(a.data) = TRUNC('some date'))
WHERE row = 100;
編輯:
我此刻的查詢:
SELECT DISTINCT pass, cod_serv FROM
(SELECT DISTINCT s.pass, cod_serv,
ROW_NUMBER() OVER(PARTITION BY TRUNC(s.data)
ORDER BY a.hour, a.min) row
FROM passes s
JOIN atend a ON s.pass = a.pass
WHERE s.situation = 'F' AND
TRUNC(s.data) = TRUNC(SYSDATE))
WHERE row = 100;
你想'(按小時,分鐘按數據順序分區)' –
和'情況'? – developer033
無論如何,所有行都會具有相同的值(因爲'situacao ='F'),所以不需要將它包含在窗口定義或訂單中。 –