Member 12832836 Ответов: 2

Sql-как получить максимальное значение для нескольких строк и нескольких столбцов на идентификатор пользователя?


Hello,

Trying to write a query to get the max value per user id. 

Joining my two tables produces a result set where the values that I need to compare are across multiple columns and multiple rows.

The values that I am comparing are across 5 columns and multiple rows. And within each row I have a column (pname) that represents the column that has the highest numeric value per row. I am looking to display just the row that has the highest 'pname' value per user id


Below is my initial query and the initial result set it generates.


  SELECT
  s.id,
  s.pname,
  s.p1,
  s.p2,
  s.p3,
  s.p4,
  s.p5

FROM "sdata" "s"
INNER JOIN "customer" "c" on "c"."id" = "s"."id"

id	pname	P1	P2	P3	P4	P5
12344	P2	1	9	4	3	4
12344	P4	2	5	4	9	5
12344	P3	3	4	9	3	6
5395	P1	9	4	6	4	3
5395	P5	2	1	5	1	9
390	P5	1	4	4	2	9


Что я уже пробовал:

ВЫБИРАТЬ
С. идентификатор,
С. изъятия,
С. П1,
С. Р2,
С. Р3,
С. Р4,
С. П5

От "sdata "" s"
Внутреннее соединение "клиента", "C" на "С"."идентификатор" = "ы"". там же"

Richard Deeming

Каков ваш ожидаемый результат?

2 Ответов

Рейтинг:
2

OriginalGriff

Попробуйте группу по: SQL GROUP BY оператор[^] в качестве внутреннего запроса для возврата id и MAX(pname) AS pname, затем соедините это с вашей исходной таблицей в качестве WHERE s.id = grouped.id AND s.pname = grouped.pname


Рейтинг:
1

Wendelius

Прежде всего, я бы предложил изменить дизайн столов. Вместо того чтобы хранить несколько значений в Столбцах p1...p5, храните их в виде строк в отдельной таблице. Это значительно упростило бы обработку данных.

Теперь что касается запроса, даже если вы сказали, что у вас есть имя столбца в PNAME, я бы поверил, что было бы проще преобразовать столбцы в строки, а затем найти максимум.

Решением грубой силы было бы использование Союза. Рассмотреть следующее:

SELECT a.id, MAX(a.val)
FROM (
   SELECT sd.id, sd.p1 as val FROM sdata sd UNION ALL
   SELECT sd.id, sd.p2 as val FROM sdata sd UNION ALL
   SELECT sd.id, sd.p3 as val FROM sdata sd UNION ALL
   SELECT sd.id, sd.p4 as val FROM sdata sd UNION ALL
   SELECT sd.id, sd.p5 as val FROM sdata sd) AS a
GROUP BY a.id