Postgres SQL эквивалент искрового окна. Разделение с row_number - PullRequest
0 голосов
/ 25 января 2020

Как правило, postgres эквивалент этой команды "spark"

val win = Window.partitionBy("department", "state").orderBy(col("salary").desc)
val h = df.withColumn("row", row_number.over(win)).where($"row" === 1).drop("row")

Таким образом, эта ranks зарплата на департамент для каждого штата и затем занимает только первый ряд, что дает вам самую высокую зарплату для каждый отдел в каждом штате. Как я могу выполнить этот запрос в postgres SQL?

Пример: Дано

+-------+----------+------+-----+
|   Name|Department|Salary|State|
+-------+----------+------+-----+
|  James|     Sales|  3000|   CA|
|Michael|     Sales|  4600|   CA|
| Robert|     Sales|  4100|   MA|
|  Jimmy|     Sales|  5100|   MA|
|  Maria|   Finance|  3000|   CA|
|  Raman|   Finance|  3200|   CA|
|  Scott|   Finance|  3300|   AZ|
|    Jen|   Finance|  3900|   AZ|
|   Mary|   Finance|  2200|   MA|
|   Jeff| Marketing|  3000|   AZ|
|   Rick| Marketing|  2000|   AZ|
|  Momer| Marketing|  1500|   CA|
|    Jun| Marketing|  2500|   CA|
|  Bobby| Marketing|  3100|   CA|
+-------+----------+------+-----+

Running spark Window partition above gives me

scala> h.show
+-------+----------+------+-----+
|   Name|Department|Salary|State|
+-------+----------+------+-----+
|   Mary|   Finance|  2200|   MA|
|  Jimmy|     Sales|  5100|   MA|
|Michael|     Sales|  4600|   CA|
|  Bobby| Marketing|  3100|   CA| // Highest salaries in each department in each state
|    Jen|   Finance|  3900|   AZ|
|  Raman|   Finance|  3200|   CA|
|   Jeff| Marketing|  3000|   AZ|
+-------+----------+------+-----+

Что такое postgres SQL эквивалент вышеупомянутого искрового запроса?

1 Ответ

1 голос
/ 25 января 2020

Это может быть реплицировано как есть с той же функцией row_number в Postgres. Используйте dense_rank для обработки связей и получения всех связанных строк (работает для любого указанного вами наибольшего 'n').

select * --explicitly select columns needed to drop rnum from the result
from (select t.*,row_number() over(partition by department,state order by salary desc) as rnum
      from tbl t
     ) t 
where rnum = 1

Еще один Postgres конкретизируется c опция должна использовать DISTINCT ON.

select distinct on (department,state) *
from tbl
order by department,state,salary desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...