SQL查询 - 选择最近的天气

时间:2017-04-29 09:55:42

标签: sql sql-server

我正在尝试将销售时具有最接近天气温度的以前产品销售到当前的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.我想得到类似的东西:

  • 产品D(这不完全匹配,但有更多平均记录的记录)
  • 产品C(因为temp和weather_code完全匹配)
  • 产品B(因为weather_code比温度和温度更接近)

除非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) - 那说;一旦我有一个开始和一些新鲜的眼睛,我可以在以后工作。

如果我还没有正确解释那么我可能只需要上床睡觉并明天重访。 :/

1 个答案:

答案 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