Дополнительные поля с МИН SQL () и GROUP BY

Это было новым для меня тоже. Никогда раньше не работал с Вороной. Но проблема в том, что ваш 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))

Итак, надеюсь, это работает для вас.

enter image description here

23
задан Tim Lytle 6 April 2009 в 20:22
поделиться

2 ответа

Если бы Вы хотели получить "самого дешевого" сотрудника в каждом отделе, то у Вас было бы два варианта первое, что пришло на ум:

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

Вторые работы оператора путем эффективного высказывания, покажите мне всех сотрудников, где Вы не можете найти другого сотрудника в том же отделе с более низкой зарплатой.

В обоих случаях, если у двух или больше сотрудников будут равные зарплаты, которые являются минимумом, то Вы получите их обоих (все).

22
ответ дан 29 November 2019 в 02:53
поделиться
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) значительно улучшит все три запроса.

1
ответ дан 29 November 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: