Подсчет очков в пределах X миль SQL

У меня есть таблица SQL с номером хранилища столбцов, широтой и долготой, содержащей 1000 хранилищ. Я хочу, чтобы на выходе была одна строка для каждого магазина со столбцами «В пределах 25 миль» и «В пределах 50 миль».

Я знаю, как создать расстояние между двумя координатами, но мне нужно перебрать каждый магазин в таблице и подсчитать, сколько магазинов находится в пределах 25 миль и сколько магазинов находится в пределах 50 миль.

Вот мой текущий код для расчета, как далеко каждый магазин находится от одного указанного магазина:

DECLARE
@GEO1 GEOGRAPHY,
@LAT VARCHAR(10),
@LONG FLOAT(30),
@STORE VARCHAR(10)

SET @STORE = 1

SET @LAT = (select convert(varchar(10),s.latitude) FROM table s where s.storeNumber = @STORE)
SET @LONG = (select convert(float(30),s.longitude) FROM table s where s.storeNumber = @STORE)

SET @geo1= geography::Point(@LAT, @LONG, 4326)

SELECT s.storeNumber
        , (@geo1.STDistance(geography::Point(ISNULL(s.latitude,0),ISNULL(s.longitude,0), 4326))) as DISTANCE
FROM table s

Почему у @LAT и @LONG разные типы данных?

Max Szczurek 19.07.2018 17:00

@LONG имеет отрицательные значения, и преобразование его в число с плавающей запятой было единственным способом заставить его работать.

Ryan Stodola 19.07.2018 17:01

Какой СУБД продукт вы используете? «SQL» - это просто язык запросов, а не имя конкретного продукта базы данных (а ваш код - нестандартный SQL). Добавьте тег для продукта базы данных, который вы используете

a_horse_with_no_name 19.07.2018 17:22

Нет, эта информация не нужна для ответа на вопрос.

Ryan Stodola 19.07.2018 17:54
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
4
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
SELECT s.storeNumber
    ,(SELECT COUNT(*) FROM tbl WHERE 
        (
            (geography::Point(s.latitude, s.longitude, 4326))
                .STDistance(geography::Point(ISNULL(tbl.latitude,0),ISNULL(tbl.longitude,0), 4326))
        ) / 1609.344 <= 25
     ) cnt_25
    ,(SELECT COUNT(*) FROM tbl WHERE 
        (
            (geography::Point(s.latitude, s.longitude, 4326))
                .STDistance(geography::Point(ISNULL(tbl.latitude,0),ISNULL(tbl.longitude,0), 4326))
        ) / 1609.344 <= 50
     ) cnt_50
FROM tbl s
WHERE storeNumber = 1

Это не то, что я хочу. Я хочу, чтобы на выходе было 1000 строк по 3 столбца. В каждой строке магазинов указано количество магазинов в пределах 25 миль и еще одно количество магазинов в пределах 50 миль.

Ryan Stodola 19.07.2018 17:12

@RyanStodola см. Отредактированный пост. Вам не нужно указывать географическую переменную. Вы можете просто пересчитать его в режиме реального времени для каждой строки. Примените фильтр storeNumber в предложении WHERE.

Max Szczurek 19.07.2018 17:29

Другие вопросы по теме