我不知道如何在max中插入列。在sql中插入帶有max的列
Select id,MAX(salary),Min(Salary)
from C
GROUP BY id;
這是給我的所有ID與它最大 ,我想只是ID與最大和工資最低!
我不知道如何在max中插入列。在sql中插入帶有max的列
Select id,MAX(salary),Min(Salary)
from C
GROUP BY id;
這是給我的所有ID與它最大 ,我想只是ID與最大和工資最低!
你有幾個選項,只需要該表的單次掃描:
的Oracle 11g R2架構設置:
CREATE TABLE C (ID, SALARY) AS
SELECT 1, 100 FROM DUAL
UNION ALL SELECT 2, 110 FROM DUAL
UNION ALL SELECT 3, 100 FROM DUAL
UNION ALL SELECT 4, 110 FROM DUAL
UNION ALL SELECT 5, 90 FROM DUAL
查詢1 - 獲取一個ID:
SELECT *
FROM (
SELECT ID, SALARY
FROM c
ORDER BY SALARY DESC
)
WHERE ROWNUM = 1
| ID | SALARY |
|----|--------|
| 2 | 110 |
查詢2 - 獲取一個單一ID(另一種方法,將獲得的最小和最大的ID):
SELECT MAX(ID) KEEP (DENSE_RANK LAST ORDER BY SALARY) AS MAX_SALARY_ID,
MAX(SALARY) AS MAX_SALARY,
MIN(ID) KEEP (DENSE_RANK FIRST ORDER BY SALARY) AS MIN_SALARY_ID,
MIN(SALARY) AS MIN_SALARY
FROM C
| MAX_SALARY_ID | MAX_SALARY | MIN_SALARY_ID | MIN_SALARY |
|---------------|------------|---------------|------------|
| 4 | 110 | 5 | 90 |
查詢3 - 獲取所有的ID與薪:
SELECT ID, SALARY
FROM (
SELECT ID,
SALARY,
RANK() OVER (ORDER BY SALARY DESC) AS RNK
FROM C
)
WHERE RNK = 1
| ID | SALARY |
|----|--------|
| 2 | 110 |
| 4 | 110 |
查詢4 - 獲取最低和最高工資所有ID:
SELECT LISTAGG(CASE MIN_RANK WHEN 1 THEN ID END, ',') WITHIN GROUP (ORDER BY ID) AS MIN_SALARY_IDS,
MAX(CASE MIN_RANK WHEN 1 THEN SALARY END) AS MIN_SALARY,
LISTAGG(CASE MAX_RANK WHEN 1 THEN ID END, ',') WITHIN GROUP (ORDER BY ID) AS MAX_SALARY_IDS,
MAX(CASE MAX_RANK WHEN 1 THEN SALARY END) AS MAX_SALARY
FROM (
SELECT ID,
SALARY,
RANK() OVER (ORDER BY SALARY ASC) AS MIN_RANK,
RANK() OVER (ORDER BY SALARY DESC) AS MAX_RANK
FROM C
)
| MIN_SALARY_IDS | MIN_SALARY | MAX_SALARY_IDS | MAX_SALARY |
|----------------|------------|----------------|------------|
| 5 | 90 | 2,4 | 110 |
查詢5:
SELECT ID,
SALARY,
CASE WHEN MIN_RANK = 1 THEN 'MIN'
WHEN MAX_RANK = 1 THEN 'MAX' END AS MIN_MAX
FROM (
SELECT ID,
SALARY,
RANK() OVER (ORDER BY SALARY ASC) AS MIN_RANK,
RANK() OVER (ORDER BY SALARY DESC) AS MAX_RANK
FROM C
)
WHERE MIN_RANK = 1 OR MAX_RANK = 1
| ID | SALARY | MIN_MAX |
|----|--------|---------|
| 2 | 110 | MAX |
| 4 | 110 | MAX |
| 5 | 90 | MIN |
爲什麼選擇查詢#4的非原子數據? –
@JulienBlanchard - 因爲對於最小值和最大值存在不確定和不相等的行數。 – MT0
嗯,我更建議有X行,每行1個ID(在這種情況下做3行,2最大和1分鐘)。只是爲了保持結果的原子性。 –
可以使用first_value
或last_value
的FIRST_VALUE解析功能類似於第一解析 功能,讓您可以從一組有序返回的第一個結果。
https://oracle-base.com/articles/misc/first-value-and-last-value-analytic-functions
create table C (id int, salary int);
insert into c values(1, 1);
insert into c values(2, 2);
insert into c values(3, 3);
insert into c values(4, 4);
insert into c values(5, 5);
Select distinct first_value(id) over (order by salary desc)
from C
FIRST_VALUE(ID)OVER(ORDERBYSAL
1 5
什麼如果兩個ID的份額最大?你想要兩個嗎? –
@MichaelBroughton是的,我喜歡。我想把它和max和min放在一起。 –