Sql 如何获得不同最大组合的计数-其中a列和B列中的值都需要不同于前一行
这是我关于堆栈溢出的第一个问题-请客气点。:) 我希望外面的一些SQL smarty裤子能给我指明正确的方向 因此,为了简单起见,我们正在处理两个专栏——提供者和站点 我应该只计算“两个不同站点的两个不同的提供者”的行数 例如,假设我有两行:Sql 如何获得不同最大组合的计数-其中a列和B列中的值都需要不同于前一行,sql,sql-server,Sql,Sql Server,这是我关于堆栈溢出的第一个问题-请客气点。:) 我希望外面的一些SQL smarty裤子能给我指明正确的方向 因此,为了简单起见,我们正在处理两个专栏——提供者和站点 我应该只计算“两个不同站点的两个不同的提供者”的行数 例如,假设我有两行: 提供者1,站点1 提供者2,站点2 这将算作2-因为他们是两个不同的提供商,在两个不同的站点 另一个例子,假设我有两行: 提供者1,站点1 提供者1,站点2 这将仅计为1,因为只有当两个不同的站点中的两个不同的提供商时,才会出现区别。因此,虽然有两
- 提供者1,站点1
- 提供者2,站点2
- 提供者1,站点1
- 提供者1,站点2
- 提供者1,站点1
- 提供者2,站点1
- 提供者1,站点1
- 提供者2,站点1
- 提供者3,站点2
- 提供者4,站点2
- 提供者5,站点2
- 提供者2,站点1
- 提供者2,站点3
- 提供者3,站点2
- 提供者4,站点2
- 提供者5,站点2
select * into #temp
from
(
select 'Provider2' p, 'Site1' s
union all select 'Provider2', 'Site3'
union all select 'Provider3', 'Site2'
union all select 'Provider4', 'Site2'
union all select 'Provider5', 'Site2'
) A
--Shows Sample
select * from #temp
drop table #temp
编辑:我正在使用Microsoft SQL Server正如上面的评论所述,我们不知道您使用的是哪种RDBMS,但根据语法,我怀疑是SQL Server。如果是这样,您可以使用以下查询 查询
select COUNT(*) + 1
from (
select a.*,
case when a.p <> a.nextP then 1 else 0 end SameP,
case when a.s <> a.nextS then 1 else 0 end SameS
from ( select *,
LEAD(p,1,NULL)OVER(ORDER BY p,s) nextP,
LEAD(s,1,NULL)OVER(ORDER BY p,s) nextS
from #temp t
) a
) b
where SameP = 1 and SameS = 1
选择计数(*)+1
从(
选择一个*,
当a.p a.nextP然后1 else 0结束SameP时,
当a.s.a.nextS然后1其他0结束SameS时的情况
从(选择*,
领先(p,1,空)超过(p,s)nextP,
领先(s,1,空)超过(按p,s排序)下一步
从#temp t
)a
)b
其中SameP=1,SameS=1
不确定您正在使用哪些RDM,但下面的查询在SQL Server和MY SQL中工作:
select count(*)
from (select t.*
, Row_number() OVER(PARTITION BY pg.pcnt ,ps.scnt ORDER BY t.p, t.s DESC) rno
from temp t
inner join (select p, count(*) pcnt from temp group by p) as pg on t.p = pg.p
inner join (select s, count(*) scnt from temp group by s) as ps on t.s = ps.s
) gps
where gps.rno = 1
在SQL server(和我的SQL)中执行此操作的另一种方法:
select count(*)
from
(
SELECT /*p, s
,*/
distinct (count(p) over(partition by s) + count(s) over(partition by p)) cnt
FROM #temp
) as gps
- 可以找到SQL Server db FIDLE
- 可以找到我的SQL DB Fiddler