2015-11-27 2 views
0

Я не знал, как вставить столбец с макс.Вставить столбец с макс. В sql

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

это дает мне все идентификатор с ней максимально и я хочу только идентификатор с максимумом и минимумом заработной платы !!

+0

, что если доля двух идентификаторов максимум? Вы хотите оба? –

+0

@MichaelBroughton Да, я делаю. И я хочу, чтобы он сочетался с максимальным и минимальным. –

ответ

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

Будет работать, но требуется два сканирования таблицы. – MT0

+0

+ возможно, что более одной записи будут возвращены с разным идентификатором, но с той же зарплатой – are

+0

спасибо вам большое, –

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 - получить единый идентификатор:

SELECT * 
FROM (
    SELECT ID, SALARY 
    FROM c 
    ORDER BY SALARY DESC 
) 
WHERE ROWNUM = 1 

Results:

| ID | SALARY | 
|----|--------| 
| 2 | 110 | 

Запрос 2 - получить единый идентификатор (метод альтернативного, который будет получать минимальный и максимальные идентификаторы):

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 | 

Query 3 - Получить все идентификаторы с максимальной зарплатой:

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 | 

Query 4 - Получить все идентификаторы минимального и максимального оклада:

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 идентификатором в строке (в этом случае делать 3 строки, 2 макс и 1 минуту). Просто чтобы сохранить результаты атомарными. –

0

вы можете использовать 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 
Смежные вопросы