powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вывести значения которых нету в другой таблице
8 сообщений из 8, страница 1 из 1
Вывести значения которых нету в другой таблице
    #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
Вывести значения которых нету в другой таблице
    #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
Вывести значения которых нету в другой таблице
    #39248191
Warden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsycho,

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

незачто. если сегодня у вас также жарко как и у нас , то не удивлён.
...
Рейтинг: 0 / 0
Вывести значения которых нету в другой таблице
    #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
Вывести значения которых нету в другой таблице
    #39251687
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
except
...
Рейтинг: 0 / 0
Вывести значения которых нету в другой таблице
    #39252064
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq, а какой вариант поскорострельней для очень больших таблиц?
...
Рейтинг: 0 / 0
Вывести значения которых нету в другой таблице
    #39252105
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

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

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


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