標題不清楚,因為我不知道如何用一句話表達問題。
我有一個名為公司的表,如下所示:
| 符號(PK) | 交換(PK) |
|---|---|
| 特斯拉 | 納斯達克 |
| 亞馬遜 | 納斯達克 |
| 中科院 | 納斯達克 |
然后我有一個表格,我在其中記錄了我所做的最后一次爬網操作。這個想法是有一個腳本,可以每天重新開始抓取,而無需重新抓取已經完成的公司。
爬網設定
| 符號(公司的 PK/FK) | 交換(PK/FK) | 上次抓取日期 | 抓取的文章數 |
|---|---|---|---|
| 特斯拉 | 納斯達克 | 19/11/2021 | 20 |
| 亞馬遜 | 納斯達克 | 12/11/2021 | 20 |
我想過做一個查詢,讓我找到所有上次抓取日期不是今天的公司。
Select * from companies where symbol,exchange in (
select symbol,exchange from crawl_settings where date != today
)
我認為這個查詢會起作用,但不會讓我找到從未被爬過的公司。預期結果:
| 符號(PK) | 交換(PK) |
|---|---|
| 亞馬遜 | 納斯達克 |
| 中科院 | 納斯達克 |
解釋:AMZN有一個舊的抓取日期,MCSFT從未被抓取過。
實際結果:
| 符號(PK) | 交換(PK) |
|---|---|
| 亞馬遜 | 納斯達克 |
uj5u.com熱心網友回復:
Impaler 的解決方案客觀上更好,因為 NOT IN 有一些挑剔的行為。但只要把它放在那里,你就非常接近在正確的軌道上。
只需調整你的不平等在哪里。
Select * from companies where symbol,exchange not in (
select symbol,exchange from crawl_settings where date = today
)
uj5u.com熱心網友回復:
您可以使用反聯接來獲取所需的行。例如:
select c.*
from companies c
left join crawl_settings s on s.symbol = c.symbol
and s.exchange = c.exchange
and s.date = today
where s.symbol is null
uj5u.com熱心網友回復:
您可以使用LEFT JOIN來檢查爬蟲運行的符號并添加檢查爬蟲今天未運行的條件,然后結合使用OR
演示
select
c.symbol,
c.exchange
from
companies c
left join crawl_settings cs on c.symbol = cs.symbol and c.exchange = cs.exchange
where
cs.last_crawl_date isnull
or cs.last_crawl_date != current_date
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361556.html
標籤:sql PostgreSQL的
