Это было новым для меня тоже. Никогда раньше не работал с Вороной. Но проблема в том, что ваш stations
фрейм данных теряет все свои функции с st_union()
.
Простое добавление не кажется жизнеспособным, поскольку порядок многоугольников не совпадает с порядком точек ранее. Поэтому пространственное соединение может быть хорошим обходным путем.
Используя мои собственные выборочные данные:
library(sf)
library(leaflet)
#will work with any polygon
samplepoints_sf <- st_sample(bw_polygon, size = 2000, type = "random", crs = st_crs(4326))[1:500]
# although coordinates are longitude/latitude, st_intersects assumes that they are planar
#create an sf-object like your example
bw_sf <- st_sf("some_variable" = sample(1:50, 500, replace = TRUE), geometry = samplepoints_sf)
#create the voronoi diagram, "some_variable" gets lost.
v <- bw_sf %>%
st_union() %>%
st_voronoi() %>%
st_collection_extract()
#do a spatial join with the original bw_sf data frame to get the data back
v_poly <- st_cast(v) %>%
st_intersection(bw_polygon) %>%
st_sf() %>%
st_join(bw_sf, join = st_contains)
#create a palette (many ways to do this step)
colors <- colorFactor(
palette = c("green", "yellow", "red"),
domain = (v_poly$some_variable)
#create the leaflet
leaflet(v_poly) %>% addTiles() %>%
addPolygons(fillColor = colors(v_poly$some_variable),
fillOpacity = 0.7,
weight = 1,
popup = paste(" some variable: ",v_poly$some_variable))
Итак, надеюсь, это работает для вас.
Если бы Вы хотели получить "самого дешевого" сотрудника в каждом отделе, то у Вас было бы два варианта первое, что пришло на ум:
SELECT
E.* -- Don't actually use *, list out all of your columns
FROM
Employees E
INNER JOIN
(
SELECT
department,
MIN(salary) AS min_salary
FROM
Employees
GROUP BY
department
) AS SQ ON
SQ.department = E.department AND
SQ.min_salary = E.salary
Или можно использовать:
SELECT
E.*
FROM
Employees E1
LEFT OUTER JOIN Employees E2 ON
E2.department = E1.department AND
E2.salary < E1.salary
WHERE
E2.employee_id IS NULL -- You can use any NOT NULL column here
Вторые работы оператора путем эффективного высказывания, покажите мне всех сотрудников, где Вы не можете найти другого сотрудника в том же отделе с более низкой зарплатой.
В обоих случаях, если у двух или больше сотрудников будут равные зарплаты, которые являются минимумом, то Вы получите их обоих (все).
SELECT e.*
FROM employee e
WHERE e.id =
(
SELECT id
FROM employee ei
WHERE ei.department = 'sales'
ORDER BY
e.salary
LIMIT 1
)
Для получения значений для каждого отдела используйте:
SELECT e.*
FROM department d
LEFT JOIN
employee e
ON e.id =
(
SELECT id
FROM employee ei
WHERE ei.department = d.id
ORDER BY
e.salary
LIMIT 1
)
Для получения значений только для тех отделов, которые имеют сотрудников используйте:
SELECT e.*
FROM (
SELECT DISTINCT eo.department
FROM employee eo
) d
JOIN
employee e
ON e.id =
(
SELECT id
FROM employee ei
WHERE ei.department = d.department
ORDER BY
e.salary
LIMIT 1
)
Конечно, имея индекс на (department, salary)
значительно улучшит все три запроса.