我正在尝试将销售时具有最接近天气温度的以前产品销售到当前的temp和weather_code。使用示例表和我尝试过的内容可能更容易解释。
tblSalesHistory:
id product_name
---------------------------
2551 Product A
2552 Product B
2553 Product A
2554 Product C
2555 Product A
2556 Product D
2557 Product C
2558 Product D
tblSalesExtraInfo:
id sale_id weather_code temp
-------------------------------------------
1 2551 122 0.00
2 2552 122 17.00
3 2553 152 6.00
4 2554 160 6.00
5 2555 012 24.00
6 2556 012 16.00
7 2557 122 16.00
8 2558 132 18.00
所以,让我们说当前的温度是16,当前的weather_code是122.我想得到类似的东西:
除非weather_code
完全匹配,否则ORDER BY ABS (temp - 16)
是不敬的。
为了获得最接近的温度,我一直在使用SELECT AVG(temp), @weather_code_score, @temp_score FROM tblSalesExtraInfo LEFT JOIN tblSalesHistory ON tblSalesExtraInfo.sales_id = tblSalesHistory.id GROUP BY product_name
ForEach Record
IF (weather_code == @current_weathercode) { SET @weather_code_score += 10; }
If (AVG(temp) IS BETWEEN (@current_temp + (@current_temp * .1))
AND (@current_temp - (@current_temp * .1)) { SET @temp_score += 10; }
EndFor
ORDER BY temp_score + weather_code_score, ABS(temp - @current_temp)
,其中16是当前的温度。除了ABS解决方案,也许我只是累了,但我认为我没有接近最终的解决方案,所以任何输入都会非常感激。
提前致谢
编辑2: 我真的无法帮助我已经尝试过的东西 - 我刚刚尝试了一大堆东西并且没有真正得到任何东西。也许伪代码可能有助于解释我在努力描绘的内容?
=IF(COUNTIF(A$2:A2,A2)=1,MAX(B$1:B1)+1,INDEX(B$2:B2,MATCH(A2,A$2:A2,0)))
所以weather_code不一定要匹配,但如果匹配,它的权重会更高。温度也不一定是完全匹配,但是如果平均值在当前温度的10%之内,则称其为更高。
这仍然不是理想的,因为这意味着在各种天气中不可避免地出售的旧物品可能总是高于仅售出几件的新产品(即使新物品仅售出关于确切的weather_code和temp) - 那说;一旦我有一个开始和一些新鲜的眼睛,我可以在以后工作。
如果我还没有正确解释那么我可能只需要上床睡觉并明天重访。 :/
答案 0 :(得分:1)
尝试以下
WITH CTE
AS (
(
SELECT TOP 1 *
FROM tblSalesExtraInfo a
INNER JOIN tblSalesHistory b
ON b.id = a.sale_id
WHERE weather_code = currentweather_code
AND a.temp > current_temp
ORDER BY
a.temp ASC
)
UNION ALL
(
SELECT TOP 1 *
FROM tblSalesExtraInfo a
INNER JOIN tblSalesHistory b
ON b.id = a.sale_id
WHERE weather_code = currentweather_code
AND a.temp <= current_temp
ORDER BY
a.temp DESC
)
)
SELECT TOP 1 *
FROM CTE
ORDER BY
ABS(temp - current_temp) ASC