Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вывести значения которых нету в другой таблице / 8 сообщений из 8, страница 1 из 1
01.06.2016, 14:49
    #39248164
Warden
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести значения которых нету в другой таблице
Всем доброго времени суток!
Не знаю, может у меня уже мозги закипели, но уже реально выглядит каким-то извращением то, что я делаю. Работаю ещё с расширением PostGis.
Задача следующая: Есть таблица "hotspots" , в ней содержатся информация о горячих точках. Необходимо вытащить точки у которых вероятность пожара больше 80 процентов, из этих точек определить, которые лежат в радиусе 2км друг от друга, если такие точки есть, то из группы точек нужно выбрать одну - самую интенсивную по температуре. Вывести получившиеся точки в файл.
Сейчас застопорился именно с отсечением точек которые менее интенсивные от общей массы. Нужно по идеи из временной таблицы, которая образовалась при запросе вероятности больше 80 процентов отсечь те, которые менее интенсивные. У меня не получилось сделать это такой командой:
Код: sql
1.
SELECT  f.id  FROM intensive_hotspots AS f, test WHERE f.id<>test.id;


Результат я думаю вы поняли какой. Сравнил одно значение точки из test.id(таблица, в которой валяются не нужные нам точки) убрал из intensive_hotspots одну точку, вывел результат, следующая точка из test.id и та же процедура, но прошлая точка уже есть в выводе. получается что и точек вывел слишком много раз, да и не сделал то что надо, потому что убрав лишние DISTINCT ом, все равно то по одной точке, которые мы должны были убрать появились. В общем что-то я заступорился, а может мозги уже прокисли. Помогите если можете сделать это как-нибудь.
P.S. скидываю код, чтобы вы поняли какое там извращение я сделал, чтобы дойти до той стадии, которую вам описал:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
#!/usr/bin/php
<?php
$dbconn=pg_connect("host=***** port=**** dbname=***** user=***** password=****") or die('Could not connect' . pg_last_error());
$createTempTableQuery = "CREATE TEMP  TABLE intensive_hotspots AS (SELECT * FROM hotspots WHERE probability > 80);";
$nearPointsQuery = "CREATE TEMP  TABLE near_point AS (SELECT f.id as f_id, f.power AS f_power, s.id AS s_id, s.power AS s_power,
 ST_Distance_Sphere(f.the_geom, s.the_geom)  FROM intensive_hotspots f, intensive_hotspots s WHERE ST_Distance_Sphere(f.the_geom, s.the_geom) < 2000 and f.id<>s.id AND f.id <s.id);";
pg_query($createTempTableQuery);
pg_query($nearPointsQuery);
$selectQuery = "SELECT * FROM near_point;";
$result = pg_query($selectQuery);
while($notice[]=pg_fetch_row($result));
array_pop($notice);
$delete_point = array();
$true_point = array();
$length_array = count($notice)-1;
for ($i=0; $i<=$length_array;$i += $count_i){
        $count_i = 0;
        $length_small_array = count($notice[$i]);
        $near_point_array = array(array());
        for ($k=0; $k<$length_small_array; $k++){
                $near_point_array[0][$k]=$notice[$i][$k];
        }
        for ($j=$i+1; $j<=$length_array;$j++){
                if ($notice[$i][0] == $notice[$j][0]){
                        for ($k=0; $k<$length_small_array; $k++){
                                $near_point_array[$count_i+1][$k]=$notice[$j][$k];
                        }
                        $count_i=$count_i+1;
                } else {
                        break;
                }
        }
        $true = 0;
        $true_1_i;
        $true_2_i;
        for ($j=0; $j<count($near_point_array);$j++){
                $a = $near_point_array[$j][1];
                $b = $near_point_array[$j][3];
                if ($a >= $b){
                        array_push($delete_point,$near_point_array[$j][2]);
                        $max = $a;
                        $max_1_i = $j;
                        $max_2_i = 0;
                } else {
                        array_push($delete_point,$near_point_array[$j][0]);
                        $max = $b;
                        $max_1_i = $j;
                        $max_2_i = 2;
                }
                if ($true < $max){
                        $true = $max;
                        $true_1_i = $max_1_i;
                        $true_2_i = $max_2_i;
                }
        }
        array_push($true_point,$near_point_array[$true_1_i][$true_2_i]);
        $count_i = $count_i+1;
}
$createTempDeletePointTable = "CREATE TEMP TABLE delete_point (id int);";
pg_query($createTempDeletePointTable);
for ($i=0; $i<count($delete_point); $i++){
        pg_query("INSERT INTO delete_point VALUES('$delete_point[$i]');");
}
$truePointQuery = "SELECT f.id, temperature,height_size, width_size, probability, power, the_geom, time_recieve FROM intensive_hotspots AS f, delete_point WHERE f.id<>delete_point.id;";
$r = pg_query($truePointQuery);
pg_close($dbconn);
?>
...
Рейтинг: 0 / 0
01.06.2016, 14:59
    #39248180
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести значения которых нету в другой таблице
Warden,

Код: sql
1.
2.
3.
4.
5.
6.
SELECT  f.id  
FROM intensive_hotspots AS f
WHERE
NOT EXISTS (
SELECT 1 FROM test WHERE f.id = test.id
);
...
Рейтинг: 0 / 0
01.06.2016, 15:08
    #39248191
Warden
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести значения которых нету в другой таблице
Lonepsycho,

Большое Вам спасибо! Все работает.
P.S. А я вот уже додумался просто удалить из таблицы intensive_hotspots те записи у которых id совпадают с test.id. В общем говорю голова что-то совсем перестала работать.
...
Рейтинг: 0 / 0
01.06.2016, 17:54
    #39248399
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести значения которых нету в другой таблице
Warden,

незачто. если сегодня у вас также жарко как и у нас , то не удивлён.
...
Рейтинг: 0 / 0
07.06.2016, 08:31
    #39251615
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести значения которых нету в другой таблице
LonepsychoWarden,
Код: sql
1.
2.
3.
4.
5.
6.
SELECT  f.id  
FROM intensive_hotspots AS f
WHERE
NOT EXISTS (
SELECT 1 FROM test WHERE f.id = test.id
);


как вариант еще так:
Код: sql
1.
2.
3.
SELECT  f.id  
FROM intensive_hotspots AS f left join test on f.id = test.id
where test.id is null
...
Рейтинг: 0 / 0
07.06.2016, 10:14
    #39251687
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести значения которых нету в другой таблице
except
...
Рейтинг: 0 / 0
07.06.2016, 15:28
    #39252064
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести значения которых нету в другой таблице
qwwq, а какой вариант поскорострельней для очень больших таблиц?
...
Рейтинг: 0 / 0
07.06.2016, 15:45
    #39252105
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести значения которых нету в другой таблице
Legushka,

смотреть на планы.

как правило планы в последних версиях для LEFT JOIN WHERE NULL | NOT EXISTS -- одинаковые до буквы. -- AntiJoin blahblahblah
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вывести значения которых нету в другой таблице / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]