LINUX.ORG.RU

Помощь с SQL-запросом

 , ,


0

2

Всем привет!

Только лишь начал изучать SQL. Столкнулся с задачей, которую затрудняюсь решить. Просьба помочь, кто чем сможет.

Суть задачи. Есть таблица: persons

id PK,
name: VARCHAR(50),
salary: INTEGER,
dt: DATETIME

В ней могут содержаться данные, вида:

1 Иван      15000 2017-08-01
2 Василий   20000 2017-08-08
3 Александр 5000  2016-01-01
4 Иван      3000  2015-05-20
5 Василий   40000 2016-07-13

Нужно составить такой запрос, чтобы в выборке были данные с максимальной salary для каждого из name, т.е. вот так:

1 Иван      15000 2017-08-01
5 Василий   40000 2016-07-13
3 Александр 5000  2016-01-01

Заранее спасибо.


а каким боком тут веб?вам на w3schools если больше негде книжки по SQL почитать

FeyFre ★★★★
()

Гугли grop by и функцию max. Вот только у тебя в результирующий выборке date есть, такое можно проделать только аналитическим запросом. Для меня такой накидать слишком сложно, да и не все субд умеют.

Aber ★★★★★
()
select name,max(salary) from table group by name
ism ★★★
()

SELECT * FROM persons AS p1 WHERE p1.salary IN (SELECT p2.salary FROM persons AS p2 WHERE p2.name=p1.name)

zaz ★★★★
()
Ответ на: комментарий от gasinvein

Не будет работать, dt не группируется. Я понял что про аналитический я зря сказал, можно подзапросом.

Aber ★★★★★
()
Ответ на: комментарий от Aber

Точно? Вроде проверил, вроде нормально.

подзапросом

Так что ли?

SELECT `persons`.*
FROM `persons`
INNER JOIN (
	SELECT id, MAX(`salary`)
	FROM `persons`
	GROUP BY `name`
) AS `max_salaries`
ON `persons`.`id` = `max_salaries`.`id`

gasinvein ★★★
()
Ответ на: комментарий от gasinvein

Вроде проверил, вроде нормально.

Даже интересно, на какой субд работает? Не sqlite случаем?

Второй запрос похож на правду.

Aber ★★★★★
()
Ответ на: комментарий от gasinvein

Я на android такое увидел, сильно удивился. Там видно свои хаки, удобно же, жаль в больших бд такое не катит.

Aber ★★★★★
()

понабежали тут советчики :) ни один не дал правильный ответ.

select p.*
from (
select name, max(salary) as salary
from persons
group by name
) as t
inner join persons as p
on p.name = t.name
bvn13 ★★★★★
()
Последнее исправление: bvn13 (всего исправлений: 2)
Ответ на: комментарий от bvn13

понабежали тут советчики :) ни один не дал правильный ответ.

твой тоже не верный
где гарантия что при join по name будет нужная дата для конкретного salary?

kiotoze ★★★★
()

опечатался первый раз

SELECT * FROM persons AS p1 WHERE p1.salary IN (SELECT max(p2.salary) FROM persons AS p2 WHERE p2.name=p1.name)
Только запрос тяжолый очень для DB

zaz ★★★★
()
Последнее исправление: zaz (всего исправлений: 1)
Ответ на: комментарий от kiotoze

условие по salary съелось

select p.*
from (
select name, max(salary) as salary
from persons
group by name
) as t
inner join persons as p
on p.name = t.name
and p.salary = t.salary
bvn13 ★★★★★
()
Ответ на: комментарий от bvn13

в чем тяжесть заключается?

Тем что сложность квадратичная в общем случае

он впринципе не выполнится

Почему же ?

PS. У вас кстати сложность еще немного выше (x^2 + 1)

zaz ★★★★
()
SELECT 
  id,
  name,
  salary,
  dt
FROM persons p1
WHERE NOT EXISTS (
  SELECT 1
  FROM persons p2
  WHERE p2.name = p1.name AND p2.salary > p1.salary
);
deadNightTiger ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.