Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获得不同最大组合的计数-其中a列和B列中的值都需要不同于前一行_Sql_Sql Server - Fatal编程技术网

Sql 如何获得不同最大组合的计数-其中a列和B列中的值都需要不同于前一行

Sql 如何获得不同最大组合的计数-其中a列和B列中的值都需要不同于前一行,sql,sql-server,Sql,Sql Server,这是我关于堆栈溢出的第一个问题-请客气点。:) 我希望外面的一些SQL smarty裤子能给我指明正确的方向 因此,为了简单起见,我们正在处理两个专栏——提供者和站点 我应该只计算“两个不同站点的两个不同的提供者”的行数 例如,假设我有两行: 提供者1,站点1 提供者2,站点2 这将算作2-因为他们是两个不同的提供商,在两个不同的站点 另一个例子,假设我有两行: 提供者1,站点1 提供者1,站点2 这将仅计为1,因为只有当两个不同的站点中的两个不同的提供商时,才会出现区别。因此,虽然有两

这是我关于堆栈溢出的第一个问题-请客气点。:) 我希望外面的一些SQL smarty裤子能给我指明正确的方向

因此,为了简单起见,我们正在处理两个专栏——提供者和站点

我应该只计算“两个不同站点的两个不同的提供者”的行数

例如,假设我有两行:

  • 提供者1,站点1
  • 提供者2,站点2
这将算作2-因为他们是两个不同的提供商,在两个不同的站点

另一个例子,假设我有两行:

  • 提供者1,站点1
  • 提供者1,站点2
这将仅计为1,因为只有当两个不同的站点中的两个不同的提供商时,才会出现区别。因此,虽然有两个不同的网站-它仍然是相同的供应商

反过来也是一样——例如,假设我有两行:

  • 提供者1,站点1
  • 提供者2,站点1
这也可以算作1,因为只有当两个不同的站点中的两个不同的提供商时,才会出现区别。因此,尽管有两个不同的提供商,但它仍然是同一个站点

一个更复杂的示例-假设我有以下5行:

  • 提供者1,站点1
  • 提供者2,站点1
  • 提供者3,站点2
  • 提供者4,站点2
  • 提供者5,站点2
这只算2。遵循这样的逻辑,只有当两个不同的站点的两个不同的提供者时,才会发生区别。因此,尽管有5个不同的提供商,但只有2个不同的站点

一个更复杂的例子:

  • 提供者2,站点1
  • 提供者2,站点3
  • 提供者3,站点2
  • 提供者4,站点2
  • 提供者5,站点2
这只能算作2。第1行和第2行是不同的站点,但它们是相同的提供者。因为它们是同一个提供者,所以只能算作1。至于第3行到第5行,它们都是不同的提供者,但都是同一个站点,因此只能算作1。总计-计数应为2

我尝试过使用一些计数不同的方法,以及将所有内容转储到临时表中并剥离行,但都没有效果

我肯定有更好的方式问这个问题,但这是我现在能做的最好的

有人能建议我如何在SQL中实现这个计数方法吗

如果需要,这里有一个示例临时表:

    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

您使用的RDBMS和版本是什么?看起来像SQL Server。我正在使用Microsoft SQL Server-谢谢!:)我正在使用Microsoft SQL Server。我会试试你上面的方法。我从未想过使用铅。我会尝试一下-谢谢你的帮助。我正在使用Microsoft SQL Server。我也会尝试你的上述方法-非常感谢你的帮助。