SQL查询-连接两个表,仅返回最低价格(续)

SQL查询-连接两个表,仅返回最低价格(续),sql,sql-server,Sql,Sql Server,我今天早些时候的帖子很快得到了一匹没有名字的马的回复。(非常感谢)我现在意识到我需要从boat_prices表中返回附加列的值。作为总结: 我有两个MSSQL表,如下所示: boat_data boat_prices 船数据包含关于船的数据行。每艘船都有一个唯一的ID(pricingRef)。船价包含每艘船的租赁价格行,每艘船可以有任意数量的行。每行也有一个pricingRef值。boat_prices表中的示例数据可能是: ID > pricingRef > pricingDe

我今天早些时候的帖子很快得到了一匹没有名字的马的回复。(非常感谢)我现在意识到我需要从boat_prices表中返回附加列的值。作为总结:

我有两个MSSQL表,如下所示:

boat_data

boat_prices
船数据包含关于船的数据行。每艘船都有一个唯一的ID(pricingRef)。船价包含每艘船的租赁价格行,每艘船可以有任意数量的行。每行也有一个pricingRef值。boat_prices表中的示例数据可能是:

ID > pricingRef > pricingDescription > seasonDescription > price

1 > ASD1 > fullDay > lowSeason > 1500
2 > ASD1 > fullDay > midSeason > 1800
3 > ASD1 > fullDay > highSeason > 2000
4 > ASD1 > perWeek > lowSeason > 9000
5 > ASD1 > perWeek > midSeason > 10000
6 > ASD1 > perWeek > highSeason > 11000
7 > ASD1 > morning > lowSeason > 800
8 > ASD1 > morning > midSeason > 1000
9 > ASD1 > morning > highSeason > 1100
10 > ASD2 > fullDay > lowSeason > 2000
11 > ASD2 > fullDay > midSeason > 2200
12 > ASD2 > fullDay > highSeason > 2400
13 > ASD2 > perWeek > lowSeason > 12000
14 > ASD2 > perWeek > midSeason > 14000
15 > ASD2 > perWeek > highSeason > 16000
16 > ASD2 > morning > lowSeason > 1000
17 > ASD2 > morning > midSeason > 1000
18 > ASD2 > morning > highSeason > 1000
等等等等

我需要做的是从boat_数据表中返回所有行,并将其连接到boat_prices表,只返回每艘船的最低价格。一匹没有名字的马想出了下面的解决方案,效果非常好。然而,我现在意识到我还需要返回pricingDescription列的值(全天、每周、早上等)。我仍然只需要返回每一船_价格行的最低价格,但我还需要知道该行的价格说明值。我试着用下面的例子来解决这个问题,但是我被难住了。你能给予的任何帮助都将受到感激。因此,理想情况下,我会在语句的嵌套部分找到以下解决方案:

select pricingref, min(price) as min_price, pricingDescription 
***更新-季节描述列表示,在某些情况下,将有多行具有相同的价格(请参见上述示例中的第16、17和18行)。价格可能会在季节描述之间重复,但不会在同一价格的价格描述之间重复

谢谢

杰森

你试过这个吗

select boat_data.*,
   t.min_price,t.pricingDescription 
from boat_data
join (
 select pricingref, min(price) as min_price,pricingDescription 
 from boat_prices
 group by pricingref,pricingDescription 
) t on t.pricingref = boat_data.pricingref;
试试这个:

select 
    boat_data.*,
    b.pricingDescription,
    t.min_price
from boat_data
inner join (
    select pricingref, min(price) as min_price
    from boat_prices
    group by pricingref
) t on t.pricingref = boat_data.pricingref
inner join boat_prices b on (b.price = t.min_price and b.pricingRef = t.pricingRef)
编辑:我根据评论中的信息添加了另一个解决方案。此版本应返回pricingRef和seasonDescription的每个组合的最低价格(如果几个季节中出现相同价格,则多行):


您可以使用以下工具:

select *
from
(
    select boat_data.boatDataField1,
           boat_data.boatDataField2,
           boat_data.boatDataField3,
           boat_data.boatDataField4,
           boat_prices.price,
           min(boat_prices.price) over (partition by boat_data.pricingref) as min_price,
           boat_prices.pricingDescription
    from boat_data
    join boat_prices on boat_prices.pricingref = boat_data.pricingref
)
where price = min_price

您可以将所有要“分组依据”的最小值(价格)字段放在分区分区中。

是。不幸的是,这不仅返回最低价格行。它返回船价中每个价格描述的一行。我需要查询只返回对应于pricingRefHi最低价格值的boat_prices中的行。这管用!谢谢你。不过我刚刚意识到了一些事情。有时,价格表中会有多行价格相同的pricingRef。所以我需要最小值(price)也是不同的。这可能吗?我很抱歉让您感到痛苦您的意思是可能有几行具有相同的价格和价格,但不同的价格描述?如果是的话,你想要所有行的价格最低还是只有一行,如果是的话,哪一行?嗨。不完全是。很抱歉,在船_价格表中还有一列是相关的“季节描述”。这将是每个大奖赛的淡季、旺季或旺季。因此,对于每个pricingRef行,有3个季节描述行。在某些情况下,相同的价格在不同的季节会出现相同的价格。重复的价格永远不会出现在不同的定价中。在本例中,第一行应仅显示。如有必要,可按ID列排序。您需要我发布一个更新的表结构以提供帮助吗?@jasoneye我不太确定我是否理解所需的输出。更新的表结构和所需的输出肯定会有所帮助(不仅仅是我,其他人也会提供答案)。@JasonEyebe如果我假设每个priceRef有九行(每个季度3行),并且您希望每个季度的价格最低(3行),我想知道使用min()是否有明显的区别vs.行号()。可能不会。@Sam:我不认为有性能上的差异。结果略有不同:如果有两个相同的价格,您的解决方案将为该船返回2行,而我的仅返回一行。True。我更喜欢min(),因为我不喜欢不确定如果多个价格相同,我会得到什么。如果您想要一条记录,而不在乎有多条记录时它是否是随机记录(尽管您可以在order by子句中添加更多字段以消除随机性),那么row_number()就是一种选择。
select boat_data.*,
       t.price, 
       t.pricingDescription
from boat_data
join (
  select pricingref, 
         price, 
         pricingDescription, 
         row_number() over (partition by pricingref order by price) as rn
  from boat_prices
) t 
  on t.pricingref = boat_data.pricingref 
 and t.rn = 1;
select *
from
(
    select boat_data.boatDataField1,
           boat_data.boatDataField2,
           boat_data.boatDataField3,
           boat_data.boatDataField4,
           boat_prices.price,
           min(boat_prices.price) over (partition by boat_data.pricingref) as min_price,
           boat_prices.pricingDescription
    from boat_data
    join boat_prices on boat_prices.pricingref = boat_data.pricingref
)
where price = min_price
select boat_data.*,
       t.price, 
       t.pricingDescription
from boat_data
join (
  select pricingref, 
         price, 
         pricingDescription, 
         row_number() over (partition by pricingref order by price) as rn
  from boat_prices
) t 
  on t.pricingref = boat_data.pricingref 
 and t.rn = 1;