查找最小值并包含正确的列值
Find minimum value AND include correct column-values
我正在尝试获取每次旅行的最低价格并知道哪些旅行详细信息对应于每次旅行的最低价格。
为此,我尝试了各种子查询、连接等变体,但由于没有 1 个主键,我无法弄清楚。
我想要实现的是获得最低价格的旅行,然后将最低价格的旅行详情包含在记录中。
SELECT travel_id, persons, days, MIN(`price`) AS `price`
FROM travel_details
WHERE 1
GROUP BY `travel_id`
HAVING MIN(price);
我的 table 列的简单版本,列是:
travel_id
、persons
、days
、price
这些列一起构成了主键。
可以为不同的人、日期和价格预订旅行。 travel_id
、persons
和 days
.
的相同组合也可能有多个价格选项
例如,
100, 2, 4, **250**
100, 2, 4, **450**
100, 2, **5**, 450
101, 2, 4, 190
101, 2, 5, 185
travel_id
100 2 人 4 人。
我想实现的是return:
100、250,然后正确对应的值:
100、2、4、250
101、2、5、185
现在我的结果只是混合了所有其他数据。当我将这些列包含在分组依据中时,它不仅会再按 travel_id
分组,而且还会按 persons
分组。然后它将 return travel_id
和 persons
的所有组合。
知道如何解决这个问题吗?
Select a.travel_id, a.persons, a.days, a.price from travel_details a
JOIN (Select travel_id,MIN(Price) as p from travel_details group by travel_id) b
on b.travel_id=a.travel_id and b.p=a.price
以上查询使用自连接。派生的 table b 将包含 travel_id 以及最低价格。
您可以使用 IN()
来执行此操作:
SELECT * FROM travel_details t
WHERE (t.travel_id,t.price) IN(SELECT s.travel_id,min(s.price)
FROM travel_details s
GROUP BY s.travel_id)
GROUP BY t.travel_id; // this last group-by is to filter doubles when there are multiple records per travel with the lowest price.
SELECT travel_id, persons, days, price
FROM (
SELECT
ROW_NUMBER() OVER(PARTITION BY travel_id, persons, days ORDER BY price) AS RowNum,
travel_id, persons, days, price
FROM travel_details
) X
WHERE X.RowNum = 1
你好@PeterH,这对你有用吗?
我正在尝试获取每次旅行的最低价格并知道哪些旅行详细信息对应于每次旅行的最低价格。
为此,我尝试了各种子查询、连接等变体,但由于没有 1 个主键,我无法弄清楚。
我想要实现的是获得最低价格的旅行,然后将最低价格的旅行详情包含在记录中。
SELECT travel_id, persons, days, MIN(`price`) AS `price`
FROM travel_details
WHERE 1
GROUP BY `travel_id`
HAVING MIN(price);
我的 table 列的简单版本,列是:
travel_id
、persons
、days
、price
这些列一起构成了主键。
可以为不同的人、日期和价格预订旅行。 travel_id
、persons
和 days
.
例如,
100, 2, 4, **250**
100, 2, 4, **450**
100, 2, **5**, 450
101, 2, 4, 190
101, 2, 5, 185
travel_id
100 2 人 4 人。
我想实现的是return: 100、250,然后正确对应的值:
100、2、4、250
101、2、5、185
现在我的结果只是混合了所有其他数据。当我将这些列包含在分组依据中时,它不仅会再按 travel_id
分组,而且还会按 persons
分组。然后它将 return travel_id
和 persons
的所有组合。
知道如何解决这个问题吗?
Select a.travel_id, a.persons, a.days, a.price from travel_details a
JOIN (Select travel_id,MIN(Price) as p from travel_details group by travel_id) b
on b.travel_id=a.travel_id and b.p=a.price
以上查询使用自连接。派生的 table b 将包含 travel_id 以及最低价格。
您可以使用 IN()
来执行此操作:
SELECT * FROM travel_details t
WHERE (t.travel_id,t.price) IN(SELECT s.travel_id,min(s.price)
FROM travel_details s
GROUP BY s.travel_id)
GROUP BY t.travel_id; // this last group-by is to filter doubles when there are multiple records per travel with the lowest price.
SELECT travel_id, persons, days, price
FROM (
SELECT
ROW_NUMBER() OVER(PARTITION BY travel_id, persons, days ORDER BY price) AS RowNum,
travel_id, persons, days, price
FROM travel_details
) X
WHERE X.RowNum = 1
你好@PeterH,这对你有用吗?