Sql server 如何在两列中查找并选择多个重复项

Sql server 如何在两列中查找并选择多个重复项,sql-server,Sql Server,我有一个SQL Server数据库表Inventory,其中有两列我感兴趣的hospital\u id和location\u id。它们各自可以有副本 我想按顺序找出有多个位置id的医院id 例如,以下是我的专栏: 输出应为: 更新: 作为Gordon查询的替代方案,您可以稍微修改@JuergenD和我最初给出的答案: SELECT hospital_id FROM yourTable GROUP BY hospital_id HAVING COUNT(*) - COUNT(DISTINCT

我有一个SQL Server数据库表
Inventory
,其中有两列我感兴趣的
hospital\u id
location\u id
。它们各自可以有副本

我想按顺序找出有多个
位置id
医院id

例如,以下是我的专栏:

输出应为:


更新:

作为Gordon查询的替代方案,您可以稍微修改@JuergenD和我最初给出的答案:

SELECT hospital_id
FROM yourTable
GROUP BY hospital_id
HAVING COUNT(*) - COUNT(DISTINCT location_id) >= 1
ORDER BY hospital_id

任何地点都有两个的医院的总计数将大于
不同的
计数。

更新:

作为Gordon查询的替代方案,您可以稍微修改@JuergenD和我最初给出的答案:

SELECT hospital_id
FROM yourTable
GROUP BY hospital_id
HAVING COUNT(*) - COUNT(DISTINCT location_id) >= 1
ORDER BY hospital_id

任何地点都有两个副本的医院,其总计数将大于
不同的
计数。

我相信您需要两个
医院id
/
地点id
对。我不知道你为什么只输出
医院id
,但你可以这样做

select hospital_id
from t
group by hospital_id, location_id
having count(*) > 1;

我相信您需要医院id的副本/
位置id
对。我不知道你为什么只输出
医院id
,但你可以这样做

select hospital_id
from t
group by hospital_id, location_id
having count(*) > 1;
还有一种方法:

SELECT TOP 1 WITH TIES hospital_id --, location_id --if you need
FROM Inventory
ORDER BY 
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY hospital_id, location_id ORDER BY location_id) = 2 THEN 0 ELSE 1 END ASC
它将显示所有医院id,至少有两行重复。

另一种方式:

SELECT TOP 1 WITH TIES hospital_id --, location_id --if you need
FROM Inventory
ORDER BY 
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY hospital_id, location_id ORDER BY location_id) = 2 THEN 0 ELSE 1 END ASC

它将显示至少有2行重复的所有
医院id
s。

您是否希望更多的医院位置以及更多的医院和位置

;with cte as (
select hospital_id,'' locaation_id, count(location_id) as locationcount from tab2
group by hospital_id
having count(location_id) > 1

union all

select hospital_id, location_id, count(*) as cnt from tab2
group by hospital_id, location_id
having count(*) > 1
)
select * from cte order by hospital_id 

在CTE的选择列表中,仅当您需要时,您才可以选择医院id。您是否希望更多的医院位置以及更多的医院和位置

;with cte as (
select hospital_id,'' locaation_id, count(location_id) as locationcount from tab2
group by hospital_id
having count(location_id) > 1

union all

select hospital_id, location_id, count(*) as cnt from tab2
group by hospital_id, location_id
having count(*) > 1
)
select * from cte order by hospital_id 
select  hospital_id,
        location_id 
into #temp1 
from inventory 
where hospital_id in (
        select hospital_id 
        from inventory 
        group by hospital_id 
        having count(hospital_id)>1)
group by hospital_id,location_id 

select hospital_id 
from #temp1 
group by hospital_id 
having count(hospital_id)>1


在CTE的选择列表中,仅当您需要时,您可以选择医院id。请将当前和预期结果作为文本发布。您的问题不明确。您是否只希望医院出现多次或医院/地点对出现多次?我希望所有医院id至少有两行重复,以及所有地点id有两行重复。请将当前结果和预期结果作为文本发布。您的问题不明确。您只希望医院出现多次还是医院/地点对出现多次?我希望所有医院id至少有两行重复,以及所有地点id有两行重复。这是发布的第一个答案。对于多个地点id,我需要获取具有相应医院id计数的任何一个。i希望所有医院id至少有两个重复行,以及所有位置id有两个重复行。这是发布的第一个答案。对于多个位置id,我需要获得具有相应医院id计数的任何一个。我希望所有医院id至少有两个重复行,以及所有位置id有两个重复行大家都认为这是唯一能产生OP预期效果的答案,其他人则错过了位置grouping@Tanner我认为你投了任何人的票,这是你的先发制人。至少我的查询为给定的示例数据生成了正确的输出。@Tanner。这个问题模棱两可。我碰巧认为我的解释可能是OP的意图,但其他答案是合理的,不值得投反对票。@TimBiegeleisen我不投反对票,虽然我的评论足以突出我的观点,但我希望所有医院id至少有两行重复,以及所有位置id有两行重复。我认为这是唯一能产生OP预期效果的答案,其他人则缺少位置grouping@Tanner我认为你投了任何人的票,这是你的先发制人。至少我的查询为给定的示例数据生成了正确的输出。@Tanner。这个问题模棱两可。我碰巧认为我的解释可能是OP的意图,但其他答案是合理的,不值得投反对票。@TimBiegeleisen我不投反对票,我认为我的评论足以突出我的观点我希望所有医院id至少有两个重复行以及所有位置id有两个重复在一起我希望所有医院id至少有两个重复行以及所有位置id有两个重复在一起我希望所有医院id有至少两个重复行以及所有位置id同时具有两个重复项我希望所有医院id至少具有两个重复行以及所有位置id同时具有两个重复项请编辑更多信息。不鼓励只编写代码和“试试这个”答案,因为它们不包含可搜索的内容,也不解释为什么有人应该“试试这个”。我们在这里努力成为知识资源。虽然这段代码可能有助于解决问题,但它没有解释为什么和/或如何回答问题。提供这种额外的环境将大大提高其长期教育价值。请您的回答添加解释,包括适用的限制和假设。我希望所有医院id至少有两行重复,以及所有位置id有两行重复。请编辑更多信息。不鼓励只编写代码和“试试这个”答案,因为它们不包含可搜索的内容,也不解释为什么有人应该“试试这个”。我们在这里努力成为知识资源。虽然这段代码可能有助于解决问题,但它没有解释为什么和/或如何回答问题。提供这种额外的环境将大大提高其长期教育价值。请您的回答添加解释,包括适用的限制和假设。我的代码返回所有
医院id
,并包含多个相同的
位置id
。你试过了吗?我的代码返回所有的
医院id
,其中包含多个相同的
位置id
。你试过了吗
select  hospital_id,
        location_id 
into #temp1 
from inventory 
where hospital_id in (
        select hospital_id 
        from inventory 
        group by hospital_id 
        having count(hospital_id)>1)
group by hospital_id,location_id 

select hospital_id 
from #temp1 
group by hospital_id 
having count(hospital_id)>1