SQL:比较相同table中的2行,满足条件时输出结果
SQL: Compare 2 rows in the same table and output result when conditions are met
我是 SQL 的新手,如果这是一个重复的问题,我深表歉意,尝试在论坛中搜索答案,但找不到任何答案。
我创建了一个临时 table 如下:
Drop TABLE if EXISTS #temp
Create table #temp(ID int, Country VARCHAR(40), ItemCount int, DeliveryDate Date, Itemtype VARCHAR(40) )
insert #temp(id,Country,itemCount,DeliveryDate,Itemtype)
Select
3012111,'Dublin', 100, '01-01-2022', 'Head Gears'
union select 2012111,'Dublin', 200, '01-05-2022', 'Head Gears'
union select 2012112,'Australia', 300, '01-03-2022', 'Knee Pad'
union select 2012110,'Australia', 100, '01-04-2022', 'Head Gears'
union select 2012113,'Singapore', 150, '01-05-2022', 'Head Gears'
union select 2012114,'Singapore', 200, '01-07-2022', 'FootWear'
union select 2012116,'Brazil', 500, '01-08-2022', 'Head Gears'
union select 2012115,'Brazil', 300, '01-06-2022', 'Head Gears'
union select 2012117,'Indonesia', 150, '01-10-2022', 'Foot Wear'
我正在尝试编写查询以仅在满足以下条件时从临时 table 输出结果:
- 按“国家/地区分组,比较商品数量和交货日期
- Return 只输出给定的最低 itemcount 的交货日期
按项目类型“Head Gears”分类的国家排在最大项目数之前。如果
对于给定的国家/地区,项目类型“头”只有一次交付
Gears”,不要 return 任何东西作为输出。
尝试过此代码但无法完成它以获得所需的输出:
Select X.Country, min(id) Id, X.ItemCount
from (
select Country, max(itemCount) itemCount
from #temp
group by Country
) X
inner join #temp T
on X.Country = T.Country
and X.itemCount = T.ItemCount
group by X.Country, X.itemCount
这是我需要的输出:https://i.stack.imgur.com/3mHWD.png
感谢您的帮助!
我假设您正在使用 SQL 服务器。
另外,如果我理解了你的问题,那么我认为你需要的输出图像是不正确的。我认为对于您提供的数据,您的结果需要是都柏林 100 而不是都柏林 200?
with t1 as (
select a.*
from #temp a
where a.country in (select b.country
from #temp b
group by b.country
having min(b.ItemCount) = a.ItemCount)),
t2 as (select a.*
from #temp a
where a.country in (select b.country
from #temp b
group by b.country
having max(b.ItemCount) = a.ItemCount))
select t1.country, t1.id, t1.ItemCount, t1.DeliveryDate, t1.Itemtype
from t1
left join t2 on t1.country = t2.country
where t1.DeliveryDate < t2.DeliveryDate
and t1.Itemtype = 'Head Gears'
and t1.Itemtype = t2.Itemtype;
我相信这可以写得更好,但我希望这对您有所帮助...
这里是 fiddle 你可以看到代码的运行:clickhere
我是 SQL 的新手,如果这是一个重复的问题,我深表歉意,尝试在论坛中搜索答案,但找不到任何答案。 我创建了一个临时 table 如下:
Drop TABLE if EXISTS #temp
Create table #temp(ID int, Country VARCHAR(40), ItemCount int, DeliveryDate Date, Itemtype VARCHAR(40) )
insert #temp(id,Country,itemCount,DeliveryDate,Itemtype)
Select
3012111,'Dublin', 100, '01-01-2022', 'Head Gears'
union select 2012111,'Dublin', 200, '01-05-2022', 'Head Gears'
union select 2012112,'Australia', 300, '01-03-2022', 'Knee Pad'
union select 2012110,'Australia', 100, '01-04-2022', 'Head Gears'
union select 2012113,'Singapore', 150, '01-05-2022', 'Head Gears'
union select 2012114,'Singapore', 200, '01-07-2022', 'FootWear'
union select 2012116,'Brazil', 500, '01-08-2022', 'Head Gears'
union select 2012115,'Brazil', 300, '01-06-2022', 'Head Gears'
union select 2012117,'Indonesia', 150, '01-10-2022', 'Foot Wear'
我正在尝试编写查询以仅在满足以下条件时从临时 table 输出结果:
- 按“国家/地区分组,比较商品数量和交货日期
- Return 只输出给定的最低 itemcount 的交货日期 按项目类型“Head Gears”分类的国家排在最大项目数之前。如果 对于给定的国家/地区,项目类型“头”只有一次交付 Gears”,不要 return 任何东西作为输出。
尝试过此代码但无法完成它以获得所需的输出:
Select X.Country, min(id) Id, X.ItemCount
from (
select Country, max(itemCount) itemCount
from #temp
group by Country
) X
inner join #temp T
on X.Country = T.Country
and X.itemCount = T.ItemCount
group by X.Country, X.itemCount
这是我需要的输出:https://i.stack.imgur.com/3mHWD.png
感谢您的帮助!
我假设您正在使用 SQL 服务器。 另外,如果我理解了你的问题,那么我认为你需要的输出图像是不正确的。我认为对于您提供的数据,您的结果需要是都柏林 100 而不是都柏林 200?
with t1 as (
select a.*
from #temp a
where a.country in (select b.country
from #temp b
group by b.country
having min(b.ItemCount) = a.ItemCount)),
t2 as (select a.*
from #temp a
where a.country in (select b.country
from #temp b
group by b.country
having max(b.ItemCount) = a.ItemCount))
select t1.country, t1.id, t1.ItemCount, t1.DeliveryDate, t1.Itemtype
from t1
left join t2 on t1.country = t2.country
where t1.DeliveryDate < t2.DeliveryDate
and t1.Itemtype = 'Head Gears'
and t1.Itemtype = t2.Itemtype;
我相信这可以写得更好,但我希望这对您有所帮助...
这里是 fiddle 你可以看到代码的运行:clickhere