1

我需要对一些数据进行分组,但因为有 4 个商店图像,sql 查询为每个商店返回 4 个结果。如何使用 sql 查询只为商店获取一个?

select s.name,si.SHOP_IMG_PATH,count(*) amount  from stab t 
inner join shop s on (s.shop_id = t.shop_id) 
inner join SHOP_IMG si on (s.shop_id= si.SHOP_ID) 
where t.acct_id = 111 and t.CR_DATE >= sysDate - 1
group by s.name,si.SHOP_IMG_PATH 
order by 3 desc,1 asc 

正如您在下图中看到的那样,有 4 张图像,因此查询可以给出随机图像

在此处输入图像描述

4

3 回答 3

1

您按 s.name、si.SHOP_IMG_PATH 进行分组,它将考虑 s.name、si.SHOP_IMG_PATH 的所有可能组合作为单独的组,您只需要按 s.name 保持分组

尝试这个

SELECT a.NAME, a.PATH, a.AMOUNT
FROM (select 
     s.name AS 'NAME', si.SHOP_IMG_PATH AS 'PATH', count(*) AS 'AMOUNT',
     ROW_NUMBER() OVER(PARTITION BY s.name
                             ORDER BY type si.SHOP_IMG_PATH) AS rk 
from 
     stab t 
inner join shop s on (s.shop_id = t.shop_id) 
inner join SHOP_IMG si on (s.shop_id= si.SHOP_ID) 
where t.acct_id = 111 and t.CR_DATE >= sysDate - 1
group by s.name
order by 3 desc,1 asc) a
WHERE a.rk = 1; 

替代方案您将获得结果,但这只是解决问题的一种解决方法和简单的替代方案,但不是一个好的解决方案。

select s.name AS 'NAME', min(si.SHOP_IMG_PATH) AS 'PATH', count(*) AS 'AMOUNT',
from 
     stab t 
inner join shop s on (s.shop_id = t.shop_id) 
inner join SHOP_IMG si on (s.shop_id= si.SHOP_ID) 
where t.acct_id = 111 and t.CR_DATE >= sysDate - 1
group by s.name
order by 3 desc,1 asc

第二个查询将根据您的需要返回结果

于 2013-03-12T11:10:27.150 回答
1
group by s.name, si.SHOP_IMG_PATH

您是在告诉它根据SHOP_IMG_PATH. 因此,它显示了 4 个结果,每个结果一个。

如果您不让它使用它,您将不得不SHOP_IMG_PATH从该子句中删除。select

编辑

得到你的评论。您正在寻找的是随机聚合。这是在不同的 SQL 引擎上以不同方式实现的。谷歌搜索你正在使用的那个。

如果是 Oracle,如问题标签所示,这里

于 2013-03-12T10:53:30.430 回答
0

我通过使用以下查询解决了我的问题,

select s.name,t.shop_id,(select min(SHOP_IMG_PATH) from SHOP_IMG si where shop_id =t.shop_id),count(*) amount  from stab t 
inner join shop s on (s.shop_id = t.shop_id) 
where t.acct_id = 111 and t.CR_DATE >= sysDate - 1
group by s.name,t.shop_id
order by 4 desc,1 asc
于 2013-03-12T11:30:26.170 回答