2015-11-27 51 views
0

我不知道如何在max中插入列。在sql中插入帶有max的列

Select id,MAX(salary),Min(Salary) 
from C 
GROUP BY id; 

這是給我的所有ID與它最大 ,我想只是ID與最大和工資最低!

+0

什麼如果兩個ID的份額最大?你想要兩個嗎? –

+0

@MichaelBroughton是的,我喜歡。我想把它和max和min放在一起。 –

回答

0
Select id, 
salary 
from C 
where salary = (select MAX(salary) 
        from C) 
+0

可以工作,但需要對錶格進行兩次掃描。 – MT0

+0

+可能有多個記錄會以不同的身份證號碼返回,但薪資相同 – are

+0

謝謝sooooo多, –

3

你有幾個選項,只需要該表的單次掃描:

SQL Fiddle

的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 

Results

| 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 

Results

| 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 

Results

| 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 
) 

Results

| 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 

Results

| ID | SALARY | MIN_MAX | 
|----|--------|---------| 
| 2 | 110 |  MAX | 
| 4 | 110 |  MAX | 
| 5 |  90 |  MIN | 
+0

爲什麼選擇查詢#4的非原子數據? –

+0

@JulienBlanchard - 因爲對於最小值和最大值存在不確定和不相等的行數。 – MT0

+0

嗯,我更建議有X行,每行1個ID(在這種情況下做3行,2最大和1分鐘)。只是爲了保持結果的原子性。 –

0

可以使用first_valuelast_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 
相關問題