簡體   English   中英

基於條件的PostgreSQL查詢

[英]postgresql query based on condition

我有一張桌子。

范例:


id | pattern | currencyid|pricelist_id| comment|cost|start_date
1  | ^.123.* |         30|           2| USA    |2.00|2014-03-20 20:12:00
2  | ^.123.* |         30|           2| USA    |3.00|2014-03-22 20:12:00
3  | ^.123.* |         30|           2| KENYA  |1.00|2014-03-24 20:12:00
4  | ^.123.* |         22|           2| CANADA |4.00|2014-03-26 20:12:00
5  | ^.123.* |         22|           2| CANADA |5.00|2014-03-29 20:12:00
6  | ^.123.* |         30|           2| USA    |6.00|2014-03-30 20:12:00
7  | ^.123.* |         30|           2| USA    |6.00|2014-04-12 20:12:00
8  | ^.123.* |         22|           2| INDIA  |8.00|2014-04-12 20:12:00

必需的輸出:

id | pattern | currencyid|pricelist_id| comment|old_cost|old_start_date     |NEW_COST|NEW_start_date
3  | ^.123.* |         30|           2| KENYA  |1.00    |2014-03-24 20:12:00|6.00    |2014-03-30 20:12:00
4  | ^.123.* |         22|           2| CANADA |4.00    |2014-03-26 20:12:00|8.00    |2014-04-12 20:12:00

說明:

首先,所有模式始終可以相同或不同。

  1. start_date> NOW()並且最接近當前日期時間,則它將被視為new_start_Date,其成本稱為new_cost

  2. start_date <NOW()並且最接近當前日期時間,則它將被視為old_date,其成本為old_cost

  3. 添加一些其他條件。

腳步 :

我正在使用以下查詢獲得所需的結果,這是一個非常漫長的過程。 如果我有一些其他地方,那么僅在下面的查詢中添加它是不合適的,需要在下面的所有查詢中添加它,並根據此結果

SELECT pattern, pricelist_id, currency_id
FROM "table"
WHERE pricelist_id=2
GROUP BY "pattern", "pricelist_id", "currency_id";

OUTPUT:
pattern | pricelist_id|currencyid
 ^.123.*|            2|30
 ^.123.*|            2|22

在PHP中使用foreach循環執行以下查詢

SELECT "id" as new_id, "cost" as new_cost, "start_date" as new_start_date
FROM "table" 
WHERE "pricelist_id" = '2' 
  AND "start_date" > '2014-03-28 10:35:26' 
  AND "pattern" = '^.123.*' 
  AND "currencyid" = '30' 
ORDER BY "start_date" ASC
LIMIT 1

SELECT "id" as old_id, "cost" as old_cost, "start_date" as old_date, "comment"
FROM "table" 
WHERE "pricelist_id" = '2' 
  AND "start_date" <= '2014-03-28 10:35:26' 
  AND "pattern" = '^123.*' 
  AND "currencyid" = '30' 
ORDER BY "id" desc, "start_date" DESC 
LIMIT 1

但是要花費一百萬條記錄需要很長時間,所以如果可能的話,請建議我查詢它運行平穩。

是否可以通過單個PostgreSQL查詢滿足所有上述要求?

嘗試使用WITH構造來獲取計算數據:

with max_date as(select * from table where start_date < now() order by start_date desc limit 1),
min_date as(select * from table where start_date > now() order by start_date asc limit 1)
SELECT code, begin_time, (select code from max_date), (select code from min_date)
FROM table v 
where id in (
    (select id from max_date)
    union all
    (select id from min_date)
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM