2016-06-03 2 views
0

У меня есть слой ГИС, который имеет тысячи идентификаторов объектов.Синтаксис логики запросов SQL-запроса GIS

  • Для каждого идентификатора объекта может быть несколько химических идентификаторов.
  • Для каждого химического идентификатора существует не более трех типов зон. Зона A, B, C. Но не всегда есть 3 типа зон, они меняются.
  • И количество химических идентификаторов для каждого идентификатора объекта может варьироваться от 1 до многих.

То, что я пытаюсь сделать, это Растворите (или группу по) этому слою вниз, чтобы отобразить который Facility ID зона имеет большой буфер расстояние, в том числе ZoneType (важный)

Вот поля

   FacilityID, ChemicalID, ZoneType, ZoneDistance 
ex rows:  1    2   A   1000 
       1    2   B   900 
       1    2   C   500 
       1    5   A   1200 
       1    5   B   900 
       1    7   B   2000 
       1    7   C   900 
       2    13   A   200 
       2    13   B   300 
       2    13   C   600 

ожидаемый результат: 1 строка для каждого идентификатора FacilityID с максимальным буфером и определенным типом зоны. Таким образом, для FacilityID 1- Я хочу одну строку, и было бы ZoneType B с ZoneDistance в 2000

FacilityID,ZoneType, ZoneDistance 
    1   B   2000 
    2   C   600 

Я попробовал несколько SQL заявление, которое я получил Facility ID с Максом ZoneDistance для каждого ZoneType. Я просто хочу Max ZoneDistance для всех типов зон в FacilityID.

SELECT max(ZoneDistance), ZoneType, FacilityID 
FROM AllZones group by ZoneType, FacilityID; 

Я также попытался подзапрос, но это не сработало

Я пол нового для SQL, и я не могу показаться, чтобы выяснить логику, чтобы получить свои результаты. Ответы приветствовали в SQL или Python

+1

какие функции ГИС вы используете? Сервер Sql, Postgres, Oracle? –

+0

'Max (ZoneDistance)' Средняя буферная область, охватывающая все «ZoneType» от каждого объекта? –

+0

Я использую Microsoft Access – ziggy

ответ

0
Select f.FacilityID, 
    f.ZoneType, 
    m.MaxZoneDistance 
from AllZones f 
    join (
      SELECT max(ZoneDistance) MaxZoneDistance, 
       FacilityID 
      FROM AllZones 
      group by FacilityID 
     ) m 
      on f.facilityID=m.facilityID 
       and MaxZoneDistance=ZoneDistance 

ВЫВОД

FacilityID ZoneType MaxZoneDistance 
1   B   2000 
2   C   600 
0

Использование этого примера в доступе. Я готовлю демоверсию в MySQL.

Achieving ROW_NUMBER/PARTITION BY in MS Access

SQL Fiddle Demo

SELECT * 
FROM (
     SELECT 
      t1.`ZoneType`, 
      t1.`FacilityID`, 
      t1.`ZoneDistance`, 
      COUNT(*) AS `rn` 
     FROM  Facility AS t1 
     INNER JOIN Facility AS t2 
       ON t1.`FacilityID` = t2.`FacilityID` 
       AND t1.`ZoneType`  = t2.`ZoneType` 
       AND t1.`ChemicalID` = t2.`ChemicalID` 
       AND t1.`ZoneDistance` <= t2.`ZoneDistance` 
     GROUP BY 
      t1.`ZoneType`, 
      t1.`FacilityID`, 
      t1.`ZoneDistance` 
     ORDER BY 
      t1.`ZoneType`, 
      t1.`FacilityID`, 
      t1.`ZoneDistance` DESC 
     ) T 
WHERE rn = 1  
ORDER BY `ZoneType`,`FacilityID` 

ВЫВОД

| ZoneType | FacilityID | ZoneDistance | rn | 
|----------|------------|--------------|----| 
|  A |   1 |   1200 | 1 | 
|  A |   2 |   200 | 1 | 
|  B |   1 |   2000 | 1 | 
|  B |   2 |   300 | 1 | 
|  C |   1 |   900 | 1 | 
|  C |   2 |   600 | 1 | 

После того как я увидел ваш результат нашел другой метод

Second DEMO

SELECT * 
FROM (
     SELECT 
      t1.`FacilityID`, 
      t1.`ChemicalID`, 
      t1.`ZoneType`, 
      t1.`ZoneDistance`, 
      (SELECT COUNT(*) 
       FROM Facility as t2 
       WHERE t1.`FacilityID` = t2.`FacilityID` 
       AND ((t1.`ZoneDistance` < t2.`ZoneDistance`) 
        OR (t1.`ZoneDistance` = t2.`ZoneDistance` and t1.`ZoneType` > t2.`ZoneType`) 
        OR (t1.`ZoneDistance` = t2.`ZoneDistance` and t1.`ZoneType` = t2.`ZoneType` and t1.`ChemicalID` > t2.`ChemicalID`) 
        ) 
      ) as rn 
     FROM  Facility AS t1 
     ORDER BY 
      t1.`FacilityID`,   
      t1.`ZoneDistance` DESC, 
      t1.`ZoneType`, 
      t1.`ChemicalID` 
    ) T 
WHERE rn = 0; 

ВЫВОД

FacilityID ChemicalID ZoneType ZoneDistance rn 
2   13   C   600    0 
1   7   B   2000   0 
Смежные вопросы