vault backup: 2023-11-10 01:44:37
This commit is contained in:
parent
c0324bb227
commit
4c79a1ec5f
@ -16,135 +16,135 @@ export function apply_guidance(doc: any) {
|
|||||||
let mostRelevantCustomerSource = null;
|
let mostRelevantCustomerSource = null;
|
||||||
|
|
||||||
// Function to update price and assign relevance indicator
|
// Function to update price and assign relevance indicator
|
||||||
function setAnchors(items, channelFirstChar, v1ds, v0ds, histKey) {
|
//function setAnchors(items, channelFirstChar, v1ds, v0ds, histKey) {
|
||||||
for (let item of items) {
|
// for (let item of items) {
|
||||||
// Update the last_price with the most recent price
|
// // Update the last_price with the most recent price
|
||||||
const years = Object.keys(item.season).map(Number).filter(year => year >= 2020);
|
// const years = Object.keys(item.season).map(Number).filter(year => year >= 2020);
|
||||||
if (years.length > 0) {
|
// if (years.length > 0) {
|
||||||
const recentYear = Math.max(...years.map(Number));
|
// const recentYear = Math.max(...years.map(Number));
|
||||||
const earlyYear = Math.min(...years.map(Number));
|
// const earlyYear = Math.min(...years.map(Number));
|
||||||
const lastPrice = item.season[recentYear].price_usd;
|
// const lastPrice = item.season[recentYear].price_usd;
|
||||||
const earlyPrice = item.season[earlyYear].price_usd;
|
// const earlyPrice = item.season[earlyYear].price_usd;
|
||||||
item.last_price = lastPrice;
|
// item.last_price = lastPrice;
|
||||||
item.early_price = earlyPrice;
|
// item.early_price = earlyPrice;
|
||||||
item.last_season = recentYear;
|
// item.last_season = recentYear;
|
||||||
item.early_season = earlyYear;
|
// item.early_season = earlyYear;
|
||||||
} else {
|
// } else {
|
||||||
item.last_price = null; // or some default value as appropriate
|
// item.last_price = null; // or some default value as appropriate
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Initialize relevance as numeric value
|
// // Initialize relevance as numeric value
|
||||||
let marketRelevance = 0; // Assume 0 is 'not relevant'
|
// let marketRelevance = 0; // Assume 0 is 'not relevant'
|
||||||
let customerRelevance = 0; // Assume 0 is 'not relevant'
|
// let customerRelevance = 0; // Assume 0 is 'not relevant'
|
||||||
|
|
||||||
|
|
||||||
// Check if the first character of the item's channel matches the first character of the document's channel
|
// // Check if the first character of the item's channel matches the first character of the document's channel
|
||||||
if (item.chan.charAt(0) === channelFirstChar) {
|
// if (item.chan.charAt(0) === channelFirstChar) {
|
||||||
marketRelevance = 1; // 'relevant'
|
// marketRelevance = 1; // 'relevant'
|
||||||
|
|
||||||
|
|
||||||
// Further refine relevance based on v1ds and v0ds
|
// // Further refine relevance based on v1ds and v0ds
|
||||||
if (item.v1ds === v1ds) {
|
// if (item.v1ds === v1ds) {
|
||||||
marketRelevance = 2; // 'most relevant' because v1ds matches
|
// marketRelevance = 2; // 'most relevant' because v1ds matches
|
||||||
|
|
||||||
// Check for customer relevance if 'cust' key exists
|
// // Check for customer relevance if 'cust' key exists
|
||||||
customerRelevance = item.cust ? 3 : 0;
|
// customerRelevance = item.cust ? 3 : 0;
|
||||||
} else if (item.v0ds === v0ds) {
|
// } else if (item.v0ds === v0ds) {
|
||||||
marketRelevance = marketRelevance === 2 ? 2 : 1; // Keep relevance as is if v1ds was matched, otherwise it's just 'relevant'
|
// marketRelevance = marketRelevance === 2 ? 2 : 1; // Keep relevance as is if v1ds was matched, otherwise it's just 'relevant'
|
||||||
customerRelevance = item.cust ? 2 : 0;
|
// customerRelevance = item.cust ? 2 : 0;
|
||||||
} else if (item.cust) {
|
// } else if (item.cust) {
|
||||||
customerRelevance = item.v1ds ? 2 : item.v0ds ? 1 : 0;
|
// customerRelevance = item.v1ds ? 2 : item.v0ds ? 1 : 0;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Assign the calculated relevance to the item
|
// // Assign the calculated relevance to the item
|
||||||
item.marketRelevance = marketRelevance;
|
// item.marketRelevance = marketRelevance;
|
||||||
item.customerRelevance = customerRelevance;
|
// item.customerRelevance = customerRelevance;
|
||||||
|
|
||||||
// Update the most relevant market price if this item's relevance is higher and it doesn't have a 'cust' key
|
// // Update the most relevant market price if this item's relevance is higher and it doesn't have a 'cust' key
|
||||||
if (marketRelevance > highestMarketRelevanceLevel) {
|
// if (marketRelevance > highestMarketRelevanceLevel) {
|
||||||
highestMarketRelevanceLevel = marketRelevance;
|
// highestMarketRelevanceLevel = marketRelevance;
|
||||||
mostRelevantMarketPrice = item.last_price;
|
// mostRelevantMarketPrice = item.last_price;
|
||||||
mostRelevantMarketPriceEarly = item.early_price;
|
// mostRelevantMarketPriceEarly = item.early_price;
|
||||||
mostRelevantMarketKey = histKey;
|
// mostRelevantMarketKey = histKey;
|
||||||
mostRelevantMarketSource = item;
|
// mostRelevantMarketSource = item;
|
||||||
delete mostRelevantMarketSource.season;
|
// delete mostRelevantMarketSource.season;
|
||||||
mostRelevantMarketSeason = item.last_season; // Assuming 'season' is the key where the season info is stored
|
// mostRelevantMarketSeason = item.last_season; // Assuming 'season' is the key where the season info is stored
|
||||||
mostRelevantMarketSeasonEarly = item.early_season;
|
// mostRelevantMarketSeasonEarly = item.early_season;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Update the most relevant customer price if this item's relevance is higher and it has a 'cust' key
|
// // Update the most relevant customer price if this item's relevance is higher and it has a 'cust' key
|
||||||
if (customerRelevance > highestCustomerRelevanceLevel) {
|
// if (customerRelevance > highestCustomerRelevanceLevel) {
|
||||||
highestCustomerRelevanceLevel = customerRelevance;
|
// highestCustomerRelevanceLevel = customerRelevance;
|
||||||
mostRelevantCustomerPriceRecent = item.last_price;
|
// mostRelevantCustomerPriceRecent = item.last_price;
|
||||||
mostRelevantCustomerPriceEarly = item.early_price;
|
// mostRelevantCustomerPriceEarly = item.early_price;
|
||||||
mostRelevantCustomerKey = histKey;
|
// mostRelevantCustomerKey = histKey;
|
||||||
mostRelevantCustomerSource = item;
|
// mostRelevantCustomerSource = item;
|
||||||
delete mostRelevantCustomerSource.season;
|
// delete mostRelevantCustomerSource.season;
|
||||||
mostRelevantCustomerSeasonRecent = item.last_season; // Assuming 'season' is the key where the season info is stored
|
// mostRelevantCustomerSeasonRecent = item.last_season; // Assuming 'season' is the key where the season info is stored
|
||||||
mostRelevantCustomerSeasonEarly = item.early_season; // Assuming 'season' is the key where the season info is stored
|
// mostRelevantCustomerSeasonEarly = item.early_season; // Assuming 'season' is the key where the season info is stored
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
// Iterate over each key in the "hist" object
|
//// Iterate over each key in the "hist" object
|
||||||
for (let key of Object.keys(doc.hist)) {
|
//for (let key of Object.keys(doc.hist)) {
|
||||||
// Update price and relevance for each item in the current key
|
// // Update price and relevance for each item in the current key
|
||||||
setAnchors(doc.hist[key], doc.chan[0], doc.v1ds, doc.v0ds, key);
|
// setAnchors(doc.hist[key], doc.chan[0], doc.v1ds, doc.v0ds, key);
|
||||||
}
|
//}
|
||||||
|
|
||||||
// Assign the most relevant market price and key to the top level of the document
|
//// Assign the most relevant market price and key to the top level of the document
|
||||||
if (mostRelevantMarketPrice !== null) {
|
//if (mostRelevantMarketPrice !== null) {
|
||||||
doc.mostRelevantMarketPriceInfo = {
|
// doc.mostRelevantMarketPriceInfo = {
|
||||||
price: mostRelevantMarketPrice,
|
// price: mostRelevantMarketPrice,
|
||||||
price_early: mostRelevantMarketPriceEarly,
|
// price_early: mostRelevantMarketPriceEarly,
|
||||||
source: mostRelevantMarketSource,
|
// source: mostRelevantMarketSource,
|
||||||
season: mostRelevantMarketSeason,
|
// season: mostRelevantMarketSeason,
|
||||||
season_early: mostRelevantMarketSeasonEarly,
|
// season_early: mostRelevantMarketSeasonEarly,
|
||||||
relevance: highestMarketRelevanceLevel
|
// relevance: highestMarketRelevanceLevel
|
||||||
};
|
// };
|
||||||
}
|
//}
|
||||||
|
|
||||||
// Assign the most relevant customer price and key to the top level of the document
|
//// Assign the most relevant customer price and key to the top level of the document
|
||||||
if (mostRelevantCustomerPriceRecent !== null) {
|
//if (mostRelevantCustomerPriceRecent !== null) {
|
||||||
doc.mostRelevantCustomerPriceInfo = {
|
// doc.mostRelevantCustomerPriceInfo = {
|
||||||
price: mostRelevantCustomerPriceRecent,
|
// price: mostRelevantCustomerPriceRecent,
|
||||||
price_early: mostRelevantCustomerPriceEarly,
|
// price_early: mostRelevantCustomerPriceEarly,
|
||||||
source: mostRelevantCustomerSource,
|
// source: mostRelevantCustomerSource,
|
||||||
season: mostRelevantCustomerSeasonRecent,
|
// season: mostRelevantCustomerSeasonRecent,
|
||||||
season_early: mostRelevantCustomerSeasonEarly,
|
// season_early: mostRelevantCustomerSeasonEarly,
|
||||||
relevance: highestCustomerRelevanceLevel
|
// relevance: highestCustomerRelevanceLevel
|
||||||
};
|
// };
|
||||||
}
|
//}
|
||||||
|
|
||||||
doc.targetPrice = doc.v1tp ?? doc.v0tp ?? null;
|
//doc.targetPrice = doc.v1tp ?? doc.v0tp ?? null;
|
||||||
// Determine the anchor price and source
|
//// Determine the anchor price and source
|
||||||
if (doc.targetPrice !== undefined && (mostRelevantCustomerPriceEarly === undefined || doc.targetPrice < mostRelevantCustomerPriceEarly)) {
|
//if (doc.targetPrice !== undefined && (mostRelevantCustomerPriceEarly === undefined || doc.targetPrice < mostRelevantCustomerPriceEarly)) {
|
||||||
doc.anchorPrice = doc.targetPrice;
|
// doc.anchorPrice = doc.targetPrice;
|
||||||
doc.anchorSource = 'Target Price';
|
// doc.anchorSource = 'Target Price';
|
||||||
} else if (mostRelevantCustomerPriceEarly !== undefined) {
|
//} else if (mostRelevantCustomerPriceEarly !== undefined) {
|
||||||
doc.anchorPrice = mostRelevantCustomerPriceEarly;
|
// doc.anchorPrice = mostRelevantCustomerPriceEarly;
|
||||||
doc.anchorSource = mostRelevantCustomerSeasonEarly + ' Customer Price';
|
// doc.anchorSource = mostRelevantCustomerSeasonEarly + ' Customer Price';
|
||||||
} else {
|
//} else {
|
||||||
doc.anchorPrice = null;
|
// doc.anchorPrice = null;
|
||||||
doc.anchorSource = 'none'; // or any other default value you wish to indicate no anchor price was found
|
// doc.anchorSource = 'none'; // or any other default value you wish to indicate no anchor price was found
|
||||||
}
|
//}
|
||||||
|
|
||||||
const inflation = Math.max(...Object.keys(doc.iidx).map(Number));
|
//const inflation = Math.max(...Object.keys(doc.iidx).map(Number));
|
||||||
const inflationFactor = doc.iidx[inflation] + 1;
|
//const inflationFactor = doc.iidx[inflation] + 1;
|
||||||
doc.inflationFactor = inflationFactor;
|
//doc.inflationFactor = inflationFactor;
|
||||||
var calcPrice = doc.anchorPrice * doc.inflationFactor;
|
//var calcPrice = doc.anchorPrice * doc.inflationFactor;
|
||||||
calcPrice = parseFloat(calcPrice.toFixed(5));
|
//calcPrice = parseFloat(calcPrice.toFixed(5));
|
||||||
let finalReason = "";
|
//let finalReason = "";
|
||||||
if (calcPrice >= doc.list) {
|
//if (calcPrice >= doc.list) {
|
||||||
doc.calcCeiling = "Cap At List";
|
// doc.calcCeiling = "Cap At List";
|
||||||
doc.finalPrice = doc.list;
|
// doc.finalPrice = doc.list;
|
||||||
finalReason = `${doc.anchorSource} ${doc.anchorPrice} x ${inflationFactor} = ${calcPrice} but cap at list ${doc.list}`;
|
// finalReason = `${doc.anchorSource} ${doc.anchorPrice} x ${inflationFactor} = ${calcPrice} but cap at list ${doc.list}`;
|
||||||
} else {
|
//} else {
|
||||||
doc.finalPrice = calcPrice;
|
// doc.finalPrice = calcPrice;
|
||||||
finalReason = `${doc.anchorSource} ${doc.anchorPrice} x ${inflationFactor} = ${calcPrice}`;
|
// finalReason = `${doc.anchorSource} ${doc.anchorPrice} x ${inflationFactor} = ${calcPrice}`;
|
||||||
}
|
//}
|
||||||
doc.finalReason = finalReason;
|
//doc.finalReason = finalReason;
|
||||||
|
|
||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ BEGIN
|
|||||||
--RAISE NOTICE 'cust %', _cust;
|
--RAISE NOTICE 'cust %', _cust;
|
||||||
|
|
||||||
----------------price history-------------------------------
|
----------------price history-------------------------------
|
||||||
SELECT _rslt||jsonb_build_object('hist',rlarp.gethist(_mold, _cust)) INTO _rslt ;
|
SELECT _rslt||jsonb_build_object('hist',rlarp.get_hist(_mold, _v1ds, _cust, substring(_chan,1,1))) INTO _rslt ;
|
||||||
--RAISE NOTICE '%', _rslt;
|
--RAISE NOTICE '%', _rslt;
|
||||||
|
|
||||||
----------------target pricing------------------------------
|
----------------target pricing------------------------------
|
||||||
@ -127,12 +127,12 @@ BEGIN
|
|||||||
priority;
|
priority;
|
||||||
_rslt := _rslt||COALESCE(_iidx,'{}'::jsonb);
|
_rslt := _rslt||COALESCE(_iidx,'{}'::jsonb);
|
||||||
|
|
||||||
----------------list ppricing-------------------------------
|
----------------list pricing--------------------------------
|
||||||
SELECT coalesce(rlarp.get_list(_bill, _ship, _item, _qty),'{}'::jsonb) INTO _list;
|
SELECT coalesce(rlarp.get_list(_bill, _ship, _item, _qty),'{}'::jsonb) INTO _list;
|
||||||
_rslt := _rslt||_list;
|
_rslt := _rslt||_list;
|
||||||
--RAISE NOTICE 'list: %', jsonb_pretty(_list);
|
--RAISE NOTICE 'list: %', jsonb_pretty(_list);
|
||||||
|
|
||||||
----------------list ppricing-------------------------------
|
----------------get premium for quote hist gap--------------
|
||||||
SELECT coalesce(rlarp.get_premium(_stlc, _seas, (SELECT xchan FROM _chx WHERE chan = _chan),_v1ds, ((_rslt->'mostRelevantCustomerPriceInfo')->'source')->>'v1ds'),'{}'::jsonb) INTO _prem;
|
SELECT coalesce(rlarp.get_premium(_stlc, _seas, (SELECT xchan FROM _chx WHERE chan = _chan),_v1ds, ((_rslt->'mostRelevantCustomerPriceInfo')->'source')->>'v1ds'),'{}'::jsonb) INTO _prem;
|
||||||
_rslt := _rslt||_prem;
|
_rslt := _rslt||_prem;
|
||||||
--RAISE NOTICE 'list: %', jsonb_pretty(_list);
|
--RAISE NOTICE 'list: %', jsonb_pretty(_list);
|
||||||
|
@ -62,23 +62,23 @@ BEGIN
|
|||||||
,i.v0ds
|
,i.v0ds
|
||||||
,jsonb_strip_nulls(jsonb_build_object('assc',CASE WHEN i.assc <> '' THEN i.assc ELSE null::text END,'majg',i.majg::int,'coltier',i.coltier));
|
,jsonb_strip_nulls(jsonb_build_object('assc',CASE WHEN i.assc <> '' THEN i.assc ELSE null::text END,'majg',i.majg::int,'coltier',i.coltier));
|
||||||
_rslt := jsonb_build_object('mold',_mold,'v1ds',_v1ds,'v0ds',_v0ds,'stlc',_stlc)||_iidx;
|
_rslt := jsonb_build_object('mold',_mold,'v1ds',_v1ds,'v0ds',_v0ds,'stlc',_stlc)||_iidx;
|
||||||
--RAISE NOTICE 'item data %', _iidx;
|
RAISE NOTICE 'item data %', _iidx;
|
||||||
|
|
||||||
----------------channel-------------------------------------
|
----------------channel-------------------------------------
|
||||||
|
|
||||||
SELECT rlarp.channel_code(_bill, _ship) INTO _chan;
|
SELECT rlarp.channel_code(_bill, _ship) INTO _chan;
|
||||||
_rslt := _rslt||jsonb_build_object('chan',_chan);
|
_rslt := _rslt||jsonb_build_object('chan',_chan);
|
||||||
--RAISE NOTICE '%', _chan;
|
RAISE NOTICE 'chan %', _chan;
|
||||||
|
|
||||||
----------------customer------------------------------------
|
----------------customer------------------------------------
|
||||||
|
|
||||||
SELECT dba INTO _cust FROM rlarp.cust WHERE code = CASE WHEN _chan = 'DRP' THEN _ship ELSE _bill END ;
|
SELECT dba INTO _cust FROM rlarp.cust WHERE code = CASE WHEN _chan = 'DRP' THEN _ship ELSE _bill END ;
|
||||||
_rslt = _rslt||jsonb_build_object('cust',_cust);
|
_rslt = _rslt||jsonb_build_object('cust',_cust);
|
||||||
--RAISE NOTICE 'cust %', _cust;
|
RAISE NOTICE 'cust %', _cust;
|
||||||
|
|
||||||
----------------price history-------------------------------
|
----------------price history-------------------------------
|
||||||
SELECT _rslt||jsonb_build_object('hist',rlarp.gethist(_mold, _cust)) INTO _rslt ;
|
SELECT _rslt||jsonb_build_object('hist',rlarp.get_hist(_mold, _v1ds, _cust, substring(_chan,1,1))) INTO _rslt ;
|
||||||
--RAISE NOTICE '%', _rslt;
|
RAISE NOTICE 'result %', _rslt;
|
||||||
|
|
||||||
----------------target pricing------------------------------
|
----------------target pricing------------------------------
|
||||||
SELECT
|
SELECT
|
||||||
@ -141,11 +141,17 @@ BEGIN
|
|||||||
GROUP BY
|
GROUP BY
|
||||||
priority;
|
priority;
|
||||||
_rslt := _rslt||COALESCE(_iidx,'{}'::jsonb);
|
_rslt := _rslt||COALESCE(_iidx,'{}'::jsonb);
|
||||||
----------------list ppricing-------------------------------
|
|
||||||
|
----------------list pricing---------------------------------
|
||||||
SELECT coalesce(rlarp.get_list(_bill, _ship, _item, _qty),'{}'::jsonb) INTO _list;
|
SELECT coalesce(rlarp.get_list(_bill, _ship, _item, _qty),'{}'::jsonb) INTO _list;
|
||||||
_rslt := _rslt||_list;
|
_rslt := _rslt||_list;
|
||||||
--RAISE NOTICE 'list: %', jsonb_pretty(_list);
|
--RAISE NOTICE 'list: %', jsonb_pretty(_list);
|
||||||
|
|
||||||
|
----------------get premium for quote hist gap--------------
|
||||||
|
--SELECT coalesce(rlarp.get_premium(_stlc, _seas, (SELECT xchan FROM _chx WHERE chan = _chan),_v1ds, ((_rslt->'mostRelevantCustomerPriceInfo')->'source')->>'v1ds'),'{}'::jsonb) INTO _prem;
|
||||||
|
--_rslt := _rslt||_prem;
|
||||||
|
--RAISE NOTICE 'list: %', jsonb_pretty(_list);
|
||||||
|
|
||||||
RETURN _rslt;
|
RETURN _rslt;
|
||||||
|
|
||||||
END;
|
END;
|
||||||
|
151
sql/get_hist.pg.sql
Normal file
151
sql/get_hist.pg.sql
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
CREATE OR REPLACE FUNCTION rlarp.get_hist(_mold text, _v1ds text, _cust text, _chan text)
|
||||||
|
RETURNS jsonb
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $func$
|
||||||
|
DECLARE
|
||||||
|
_result jsonb;
|
||||||
|
BEGIN
|
||||||
|
WITH
|
||||||
|
--sel AS (select 'v1:P.P.PLT..' _v1ds, 'ALTMAN PLANTS' _cust, 'XNT0TQT3' _mold, 'D' _chan)
|
||||||
|
sort AS (
|
||||||
|
SELECT
|
||||||
|
p.agglevel
|
||||||
|
,CASE WHEN p.agglevel ? 'cust' THEN 'cust' ELSE 'market' END source
|
||||||
|
,COALESCE(gset.v1ds = _v1ds,false) v1ds_match
|
||||||
|
,gset.chan = _chan chan_match
|
||||||
|
,gset.*
|
||||||
|
,row_number() OVER (PARTITION BY p.agglevel ORDER BY avgunits DESC) rn
|
||||||
|
,stats.*
|
||||||
|
FROM
|
||||||
|
rlarp.price_pool_dev p
|
||||||
|
JOIN LATERAL jsonb_to_record(gset) AS gset(
|
||||||
|
chan text
|
||||||
|
,mold text
|
||||||
|
,v1ds text
|
||||||
|
,v0ds text
|
||||||
|
,cust text
|
||||||
|
,vers text
|
||||||
|
--,nurs text
|
||||||
|
--,ghse text
|
||||||
|
) ON TRUE
|
||||||
|
JOIN LATERAL jsonb_to_record(stats) AS stats(
|
||||||
|
avgunits numeric
|
||||||
|
,avgtargetprice numeric
|
||||||
|
,avgordcount numeric
|
||||||
|
,avgcustcount numeric
|
||||||
|
,early_season int
|
||||||
|
,early_price numeric
|
||||||
|
,recent_season int
|
||||||
|
,recent_price numeric
|
||||||
|
) ON TRUE
|
||||||
|
WHERE
|
||||||
|
gset @> jsonb_build_object(
|
||||||
|
'mold', _mold
|
||||||
|
,'vers', 'A'
|
||||||
|
)
|
||||||
|
AND (
|
||||||
|
gset @> jsonb_build_object(
|
||||||
|
'cust', _cust
|
||||||
|
)
|
||||||
|
OR NOT gset ? 'cust'
|
||||||
|
)
|
||||||
|
AND COALESCE(stats.early_season,stats.recent_season) IS NOT NULL
|
||||||
|
AND NOT p.agglevel ? 'nurs'
|
||||||
|
AND NOT p.agglevel ? 'ghse'
|
||||||
|
ORDER BY
|
||||||
|
source ASC
|
||||||
|
,rn ASC
|
||||||
|
)
|
||||||
|
,flag AS (
|
||||||
|
SELECT
|
||||||
|
--agglevel
|
||||||
|
CASE source
|
||||||
|
WHEN 'cust' THEN
|
||||||
|
CASE WHEN v1ds IS NOT NULL THEN
|
||||||
|
CASE WHEN v1ds_match THEN 'customer exact' ELSE
|
||||||
|
CASE WHEN rn = 1 THEN 'customer v1ds vol' ELSE 'customer v1ds other' END
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
CASE WHEN rn = 1 THEN 'customer v0ds vol' ELSE 'customer v0ds other' END
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
CASE WHEN v1ds IS NOT NULL THEN
|
||||||
|
CASE WHEN v1ds_match THEN 'market exact' ELSE
|
||||||
|
CASE WHEN rn = 1 THEN 'market v1ds vol' ELSE 'market v1ds other' END
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
CASE WHEN rn = 1 THEN 'market v0ds vol' ELSE 'market v0ds other' END
|
||||||
|
END
|
||||||
|
END relevance
|
||||||
|
,source
|
||||||
|
,v1ds_match
|
||||||
|
,chan_match
|
||||||
|
,chan
|
||||||
|
,mold
|
||||||
|
,v1ds
|
||||||
|
,v0ds
|
||||||
|
,cust
|
||||||
|
,vers
|
||||||
|
,rn
|
||||||
|
,avgunits
|
||||||
|
,avgordcount
|
||||||
|
,avgcustcount
|
||||||
|
,avgtargetprice
|
||||||
|
,early_season
|
||||||
|
,early_price
|
||||||
|
,recent_season
|
||||||
|
,recent_price
|
||||||
|
FROM
|
||||||
|
sort
|
||||||
|
)
|
||||||
|
,rel AS (
|
||||||
|
SELECT * FROM (values
|
||||||
|
('customer exact' ,1)
|
||||||
|
,('customer v0ds other',7)
|
||||||
|
,('customer v0ds vol' ,3)
|
||||||
|
,('customer v1ds other',6)
|
||||||
|
,('customer v1ds vol' ,2)
|
||||||
|
,('market exact' ,4)
|
||||||
|
,('market v0ds other' ,9)
|
||||||
|
,('market v0ds vol' ,5)
|
||||||
|
,('market v1ds other' ,8)
|
||||||
|
) x (flag,prefer)
|
||||||
|
)
|
||||||
|
,rel_sort AS (
|
||||||
|
SELECT
|
||||||
|
-- flag.relevance
|
||||||
|
--,flag.source
|
||||||
|
--,rel.prefer
|
||||||
|
--,row_number() OVER (PARTITION BY flag.source ORDER BY rel.prefer ASC) best
|
||||||
|
jsonb_strip_nulls(
|
||||||
|
jsonb_build_object(
|
||||||
|
relevance
|
||||||
|
,jsonb_build_object(
|
||||||
|
'avgunits' ,avgunits
|
||||||
|
,'avgordcount' ,avgordcount
|
||||||
|
,'avgcustcount' ,avgcustcount
|
||||||
|
,'avgtargetprice' ,avgtargetprice
|
||||||
|
,'early_season' ,early_season
|
||||||
|
,'early_price' ,early_price
|
||||||
|
,'recent_season' ,recent_season
|
||||||
|
,'recent_price' ,recent_price
|
||||||
|
,'ds' ,COALESCE(v1ds,v0ds)
|
||||||
|
,'rank'
|
||||||
|
,row_number() OVER (PARTITION BY flag.source ORDER BY rel.prefer ASC)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) doc
|
||||||
|
FROM
|
||||||
|
flag
|
||||||
|
LEFT OUTER JOIN rel ON
|
||||||
|
rel.flag = flag.relevance
|
||||||
|
WHERE
|
||||||
|
relevance ~ 'vol|exact'
|
||||||
|
)
|
||||||
|
--SELECT jsonb_pretty(jsonb_agg(doc)) FROM rel_sort
|
||||||
|
SELECT jsonb_obj_aggc(doc) INTO _result FROM rel_sort;
|
||||||
|
|
||||||
|
RETURN _result;
|
||||||
|
|
||||||
|
END
|
||||||
|
$func$;
|
@ -22,8 +22,10 @@ BEGIN
|
|||||||
gset,
|
gset,
|
||||||
(SELECT string_agg(ae.v, '.') FROM jsonb_array_elements_text(p.agglevel) ae(v)) AS agglvl,
|
(SELECT string_agg(ae.v, '.') FROM jsonb_array_elements_text(p.agglevel) ae(v)) AS agglvl,
|
||||||
season,
|
season,
|
||||||
|
stats,
|
||||||
(SELECT doc FROM getj) AS gdoc
|
(SELECT doc FROM getj) AS gdoc
|
||||||
FROM rlarp.price_pool_dev p
|
FROM
|
||||||
|
rlarp.price_pool_dev p
|
||||||
WHERE
|
WHERE
|
||||||
gset @> jsonb_build_object(
|
gset @> jsonb_build_object(
|
||||||
'mold', (SELECT doc->>'mold' FROM getj),
|
'mold', (SELECT doc->>'mold' FROM getj),
|
||||||
@ -41,7 +43,7 @@ BEGIN
|
|||||||
SELECT
|
SELECT
|
||||||
jsonb_build_object(
|
jsonb_build_object(
|
||||||
agg.agglvl,
|
agg.agglvl,
|
||||||
jsonb_agg(gset || jsonb_build_object('season', season))
|
jsonb_agg(gset || jsonb_build_object('season', season,'stats',stats))
|
||||||
) AS data,
|
) AS data,
|
||||||
gdoc
|
gdoc
|
||||||
FROM agg
|
FROM agg
|
||||||
|
@ -1,45 +1,141 @@
|
|||||||
WITH
|
WITH
|
||||||
getj AS (
|
sel AS (select 'v1:P.P.PLT..' _v1ds, 'ALTMAN PLANTS' _cust, 'TFR001G0' _mold, 'D' _chan)
|
||||||
|
,sort AS (
|
||||||
SELECT
|
SELECT
|
||||||
(
|
p.agglevel
|
||||||
SELECT
|
,CASE WHEN p.agglevel ? 'cust' THEN 'cust' ELSE 'market' END source
|
||||||
jsonb_build_object('mold',JSON_AGG(DISTINCT stlc)) doc
|
,COALESCE(gset.v1ds = (SELECT _v1ds FROM sel),false) v1ds_match
|
||||||
FROM
|
,gset.chan = _chan chan_match
|
||||||
"CMS.CUSLG".itemm
|
,gset.*
|
||||||
WHERE
|
,row_number() OVER (PARTITION BY p.agglevel ORDER BY avgunits DESC) rn
|
||||||
item ~ 'TUH10000A10B04'
|
,stats.*
|
||||||
) ||
|
|
||||||
(
|
|
||||||
SELECT
|
|
||||||
jsonb_build_object('cust',JSONB_AGG(DISTINCT c.dba))
|
|
||||||
FROM
|
|
||||||
rlarp.cust c
|
|
||||||
WHERE
|
|
||||||
c.dba ~ 'DIAMOND R'
|
|
||||||
) doc
|
|
||||||
)
|
|
||||||
,agg AS (
|
|
||||||
SELECT
|
|
||||||
gset
|
|
||||||
,(SELECT string_agg(ae.v,'.') FROM jsonb_array_elements_text(p.agglevel) ae(v)) agglvl
|
|
||||||
,season
|
|
||||||
--,(select doc from getj) gdoc
|
|
||||||
FROM
|
FROM
|
||||||
rlarp.price_pool_dev p
|
rlarp.price_pool_dev p
|
||||||
|
CROSS JOIN sel
|
||||||
|
JOIN LATERAL jsonb_to_record(gset) AS gset(
|
||||||
|
chan text
|
||||||
|
,mold text
|
||||||
|
,v1ds text
|
||||||
|
,v0ds text
|
||||||
|
,cust text
|
||||||
|
,vers text
|
||||||
|
--,nurs text
|
||||||
|
--,ghse text
|
||||||
|
) ON TRUE
|
||||||
|
JOIN LATERAL jsonb_to_record(stats) AS stats(
|
||||||
|
avgunits numeric
|
||||||
|
,avgtargetprice numeric
|
||||||
|
,avgordcount numeric
|
||||||
|
,avgcustcount numeric
|
||||||
|
,early_season int
|
||||||
|
,early_price numeric
|
||||||
|
,recent_season int
|
||||||
|
,recent_price numeric
|
||||||
|
) ON TRUE
|
||||||
WHERE
|
WHERE
|
||||||
--gut the exact mold and actuals only
|
|
||||||
gset @> jsonb_build_object(
|
gset @> jsonb_build_object(
|
||||||
'mold',(SELECT doc->'mold'->>0 FROM getj),
|
'mold', (SELECT _mold FROM sel)
|
||||||
'vers','A'
|
,'vers', 'A'
|
||||||
)
|
)
|
||||||
--pull either the exact customer or no customer
|
|
||||||
AND (
|
AND (
|
||||||
gset @> jsonb_build_object(
|
gset @> jsonb_build_object(
|
||||||
'cust',(SELECT doc->'cust'->>0 FROM getj)
|
'cust', (SELECT _cust FROM sel)
|
||||||
)
|
)
|
||||||
OR NOT gset ? 'cust'
|
OR NOT gset ? 'cust'
|
||||||
)
|
)
|
||||||
|
AND COALESCE(stats.early_season,stats.recent_season) IS NOT NULL
|
||||||
|
AND NOT p.agglevel ? 'nurs'
|
||||||
|
AND NOT p.agglevel ? 'ghse'
|
||||||
ORDER BY
|
ORDER BY
|
||||||
agglevel ASC
|
source ASC
|
||||||
|
,rn ASC
|
||||||
)
|
)
|
||||||
SELECT * FROM agg
|
--,flag AS (
|
||||||
|
--SELECT
|
||||||
|
-- --agglevel
|
||||||
|
-- CASE source
|
||||||
|
-- WHEN 'cust' THEN
|
||||||
|
-- CASE WHEN v1ds IS NOT NULL THEN
|
||||||
|
-- CASE WHEN v1ds_match THEN 'customer exact' ELSE
|
||||||
|
-- CASE WHEN rn = 1 THEN 'customer v1ds vol' ELSE 'customer v1ds other' END
|
||||||
|
-- END
|
||||||
|
-- ELSE
|
||||||
|
-- CASE WHEN rn = 1 THEN 'customer v0ds vol' ELSE 'customer v0ds other' END
|
||||||
|
-- END
|
||||||
|
-- ELSE
|
||||||
|
-- CASE WHEN v1ds IS NOT NULL THEN
|
||||||
|
-- CASE WHEN v1ds_match THEN 'market exact' ELSE
|
||||||
|
-- CASE WHEN rn = 1 THEN 'market v1ds vol' ELSE 'market v1ds other' END
|
||||||
|
-- END
|
||||||
|
-- ELSE
|
||||||
|
-- CASE WHEN rn = 1 THEN 'market v0ds vol' ELSE 'market v0ds other' END
|
||||||
|
-- END
|
||||||
|
-- END relevance
|
||||||
|
-- ,source
|
||||||
|
-- ,v1ds_match
|
||||||
|
-- ,chan_match
|
||||||
|
-- ,chan
|
||||||
|
-- ,mold
|
||||||
|
-- ,v1ds
|
||||||
|
-- ,v0ds
|
||||||
|
-- ,cust
|
||||||
|
-- ,vers
|
||||||
|
-- ,rn
|
||||||
|
-- ,avgunits
|
||||||
|
-- ,avgordcount
|
||||||
|
-- ,avgcustcount
|
||||||
|
-- ,avgtargetprice
|
||||||
|
-- ,early_season
|
||||||
|
-- ,early_price
|
||||||
|
-- ,recent_season
|
||||||
|
-- ,recent_price
|
||||||
|
--FROM
|
||||||
|
-- sort
|
||||||
|
--)
|
||||||
|
--,rel AS (
|
||||||
|
-- SELECT * FROM (values
|
||||||
|
-- ('customer exact' ,1)
|
||||||
|
-- ,('customer v0ds other',7)
|
||||||
|
-- ,('customer v0ds vol' ,3)
|
||||||
|
-- ,('customer v1ds other',6)
|
||||||
|
-- ,('customer v1ds vol' ,2)
|
||||||
|
-- ,('market exact' ,4)
|
||||||
|
-- ,('market v0ds other' ,9)
|
||||||
|
-- ,('market v0ds vol' ,5)
|
||||||
|
-- ,('market v1ds other' ,8)
|
||||||
|
-- ) x (flag,prefer)
|
||||||
|
--)
|
||||||
|
--,rel_sort AS (
|
||||||
|
-- SELECT
|
||||||
|
-- -- flag.relevance
|
||||||
|
-- --,flag.source
|
||||||
|
-- --,rel.prefer
|
||||||
|
-- --,row_number() OVER (PARTITION BY flag.source ORDER BY rel.prefer ASC) best
|
||||||
|
-- jsonb_strip_nulls(
|
||||||
|
-- jsonb_build_object(
|
||||||
|
-- relevance
|
||||||
|
-- ,jsonb_build_object(
|
||||||
|
-- 'avgunits' ,avgunits
|
||||||
|
-- ,'avgordcount' ,avgordcount
|
||||||
|
-- ,'avgcustcount' ,avgcustcount
|
||||||
|
-- ,'avgtargetprice' ,avgtargetprice
|
||||||
|
-- ,'early_season' ,early_season
|
||||||
|
-- ,'early_price' ,early_price
|
||||||
|
-- ,'recent_season' ,recent_season
|
||||||
|
-- ,'recent_price' ,recent_price
|
||||||
|
-- ,'ds' ,COALESCE(v1ds,v0ds)
|
||||||
|
-- ,'rank'
|
||||||
|
-- ,row_number() OVER (PARTITION BY flag.source ORDER BY rel.prefer ASC)
|
||||||
|
-- )
|
||||||
|
-- )
|
||||||
|
-- ) doc
|
||||||
|
-- FROM
|
||||||
|
-- flag
|
||||||
|
-- LEFT OUTER JOIN rel ON
|
||||||
|
-- rel.flag = flag.relevance
|
||||||
|
-- WHERE
|
||||||
|
-- relevance ~ 'vol|exact'
|
||||||
|
--)
|
||||||
|
----SELECT jsonb_pretty(jsonb_agg(doc)) FROM rel_sort
|
||||||
|
----SELECT jsonb_pretty(jsonb_obj_aggc(doc)) FROM rel_sort
|
||||||
|
SELECT * FROM sort
|
||||||
|
@ -22,6 +22,7 @@ CREATE TABLE IF NOT EXISTS rlarp.price_pool_dev AS (
|
|||||||
,round(sum(o.qty),0) units
|
,round(sum(o.qty),0) units
|
||||||
,round(sum(o.sales_usd),0) sales_usd
|
,round(sum(o.sales_usd),0) sales_usd
|
||||||
,round(sum(COALESCE(tp.target_price,tq.target_price) * o.qty),2) target_price
|
,round(sum(COALESCE(tp.target_price,tq.target_price) * o.qty),2) target_price
|
||||||
|
,count(DISTINCT o.ordnum) ordcount
|
||||||
FROM
|
FROM
|
||||||
rlarp.osm_stack o
|
rlarp.osm_stack o
|
||||||
INNER JOIN "CMS.CUSLG".itemm i ON
|
INNER JOIN "CMS.CUSLG".itemm i ON
|
||||||
@ -52,6 +53,7 @@ CREATE TABLE IF NOT EXISTS rlarp.price_pool_dev AS (
|
|||||||
WHERE
|
WHERE
|
||||||
o.version IN ('Actual','Quotes')
|
o.version IN ('Actual','Quotes')
|
||||||
AND o.oseas >= 2015
|
AND o.oseas >= 2015
|
||||||
|
AND o.dsm <> 'PW'
|
||||||
--AND o.part like 'SQL035%'
|
--AND o.part like 'SQL035%'
|
||||||
--AND o.calc_status <> 'CANCELED'
|
--AND o.calc_status <> 'CANCELED'
|
||||||
--AND o.fs_line = '41010'
|
--AND o.fs_line = '41010'
|
||||||
@ -93,8 +95,10 @@ CREATE TABLE IF NOT EXISTS rlarp.price_pool_dev AS (
|
|||||||
,sum(units ) units
|
,sum(units ) units
|
||||||
,sum(sales_usd) sales_usd
|
,sum(sales_usd) sales_usd
|
||||||
,round(sum(sales_usd )/sum(units),5) price_usd
|
,round(sum(sales_usd )/sum(units),5) price_usd
|
||||||
,round(sum(target_price)/sum(units),5) target_price
|
,round(sum(target_price)/sum(units) FILTER (WHERE COALESCE(target_price,0) <> 0 ),5) target_price
|
||||||
,jsonb_agg(DISTINCT coltier) coltier
|
,jsonb_agg(DISTINCT coltier) coltier
|
||||||
|
,count(DISTINCT customer) custcount
|
||||||
|
,sum(ordcount) ordcount
|
||||||
FROM
|
FROM
|
||||||
agg
|
agg
|
||||||
GROUP BY
|
GROUP BY
|
||||||
@ -111,10 +115,17 @@ CREATE TABLE IF NOT EXISTS rlarp.price_pool_dev AS (
|
|||||||
,(oseas, version, baseitem, chanwide, v0dataseg, greenhouse_region )
|
,(oseas, version, baseitem, chanwide, v0dataseg, greenhouse_region )
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
,find_stats AS (
|
||||||
SELECT
|
SELECT
|
||||||
gset
|
gset
|
||||||
,jsonb_object_agg(oseas,jsonb_build_object('units',units,'sales_usd',sales_usd,'price_usd',price_usd,'target_price',target_price)) season
|
,jsonb_object_agg(oseas,jsonb_build_object('units',units,'sales_usd',sales_usd,'price_usd',price_usd,'target_price',target_price)) season
|
||||||
,(SELECT JSONB_AGG(k.v ORDER BY k.v ASC) FROM jsonb_object_keys(gset) k(v)) agglevel
|
,(SELECT JSONB_AGG(k.v ORDER BY k.v ASC) FROM jsonb_object_keys(gset) k(v)) agglevel
|
||||||
|
,round(avg(custcount),1) avgcustcount
|
||||||
|
,round(avg(ordcount) ,1) avgordcount
|
||||||
|
,round(avg(units) ,0) avgunits
|
||||||
|
,round(avg(target_price),5) avgtargetprice
|
||||||
|
,min(oseas) FILTER (WHERE oseas BETWEEN 2020 AND 2022)::text early_season
|
||||||
|
,min(oseas) FILTER (WHERE oseas >= 2024)::text recent_season
|
||||||
--,oseas
|
--,oseas
|
||||||
--,units
|
--,units
|
||||||
--,sales_usd
|
--,sales_usd
|
||||||
@ -123,9 +134,35 @@ CREATE TABLE IF NOT EXISTS rlarp.price_pool_dev AS (
|
|||||||
gsets
|
gsets
|
||||||
WHERE
|
WHERE
|
||||||
oseas IS NOT NULL
|
oseas IS NOT NULL
|
||||||
--AND gset @> jsonb_build_object('baseitem', 'XNS0T1G3')
|
--AND gset @> jsonb_build_object('mold', 'XNS0T1G3')
|
||||||
GROUP BY
|
GROUP BY
|
||||||
gset
|
gset
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
gset
|
||||||
|
,season
|
||||||
|
,agglevel
|
||||||
|
,jsonb_build_object(
|
||||||
|
'avgcustcount'
|
||||||
|
,avgcustcount
|
||||||
|
,'avgordcount'
|
||||||
|
,avgordcount
|
||||||
|
,'avgunits'
|
||||||
|
,avgunits
|
||||||
|
,'avgtargetprice'
|
||||||
|
,avgtargetprice
|
||||||
|
,'early_season'
|
||||||
|
,early_season::int
|
||||||
|
,'early_price'
|
||||||
|
,(season->early_season->>'price_usd')::numeric
|
||||||
|
,'recent_season'
|
||||||
|
,recent_season::int
|
||||||
|
,'recent_price'
|
||||||
|
,(season->recent_season->>'price_usd')::numeric
|
||||||
|
) stats
|
||||||
|
FROM
|
||||||
|
find_stats
|
||||||
|
--LIMIT 1000
|
||||||
) WITH DATA;
|
) WITH DATA;
|
||||||
|
|
||||||
create index ppd_gset on rlarp.price_pool_dev using gin (gset);
|
create index ppd_gset on rlarp.price_pool_dev using gin (gset);
|
||||||
|
Loading…
Reference in New Issue
Block a user