[英]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
說明:
首先,所有模式始終可以相同或不同。
start_date> NOW()並且最接近當前日期時間,則它將被視為new_start_Date,其成本稱為new_cost
start_date <NOW()並且最接近當前日期時間,則它將被視為old_date,其成本為old_cost
添加一些其他條件。
腳步 :
我正在使用以下查詢獲得所需的結果,這是一個非常漫長的過程。 如果我有一些其他地方,那么僅在下面的查詢中添加它是不合適的,需要在下面的所有查詢中添加它,並根據此結果
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.