Sql 获取具有多行且具有相同生效日期的项目

Sql 获取具有多行且具有相同生效日期的项目,sql,sql-server-2014,Sql,Sql Server 2014,我希望在SQL Server 2014中运行SQL,以获取表中超过一行的项目(INV_ITEM_ID),以及具有相同生效日期(EFFDT)的项目,如下例所示 SETID INV_ITEM_ID VENDOR_SETID VENDOR_ID UNIT_OF_MEASURE EFFDT ----------------------------------------------------------------------------------------- SHARE 1

我希望在SQL Server 2014中运行SQL,以获取表中超过一行的项目(
INV_ITEM_ID
),以及具有相同生效日期(
EFFDT
)的项目,如下例所示

SETID   INV_ITEM_ID VENDOR_SETID    VENDOR_ID   UNIT_OF_MEASURE   EFFDT
-----------------------------------------------------------------------------------------
SHARE   1           SHARE           ERSUT       BX                2018-07-16 00:00:00.000
SHARE   1           SHARE           ERSUT       BX                2018-09-01 00:00:00.000
SHARE   10          SHARE           ERSUT       RL                1901-01-01 00:00:00.000
SHARE   100         SHARE           JJHS        CS                1901-01-01 00:00:00.000
SHARE   100         SHARE           PSMED       CS                1901-01-01 00:00:00.000
上述输出中的项目100是多次出现且两行上的EFFDT(1901-01-01)相同的项目的良好示例

这是我尝试过的SQL,但是它没有给我预期的输出:

SELECT 
    SETID, INV_ITEM_ID, VENDOR_SETID, VENDOR_ID, UNIT_OF_MEASURE, EFFDT
FROM 
    PS_ITM_VNDR_UOM_PR A
WHERE 
    EXISTS (SELECT 1 FROM PS_ITM_VNDR_UOM_PR B
            WHERE B.INV_ITEM_ID = A.INV_ITEM_ID AND B.EFFDT = A.EFFDT)
GROUP BY 
    SETID, INV_ITEM_ID, VENDOR_SETID, VENDOR_ID, UNIT_OF_MEASURE, EFFDT
HAVING 
    COUNT(INV_ITEM_ID) > 1 AND COUNT(EFFDT) > 1
ORDER BY 
    INV_ITEM_ID

以下查询应获得您想要的结果:

with x as (
select inv_item_id, effdt
  from ps_itm_vndr_uom_pr
  group by inv_item_id, effdt
  having count(*) > 1 
)
select inv_item_id
  from x
  group by inv_item_id
  having count(*) = 1

您要选择
INV\u ITEM\u ID
EFFDT
>1的行计数的所有行。这可以通过
计数来轻松解决:

select setid, inv_item_id, vendor_setid, vendor_id, unit_of_measure, effdt
from
(
  select *, count(*) over (partition by inv_item_id, effdt) as cnt
  from ps_itm_vndr_uom_pr
) t
where cnt > 1
order by inv_item_id, effdt;

如果INV_ITEM_ID=1有一个与第一行相等的额外行,该怎么办?是否符合标准?它将有三行(两行具有相同的日期)。感谢您的响应,因此这将返回具有相同INV_ITEM_ID和EFFDT的对应行的行。是否可以显示重复项,例如,我在结果项100中看到两次?
select setid, inv_item_id, vendor_setid, vendor_id, unit_of_measure, effdt
from
(
  select *, count(*) over (partition by inv_item_id, effdt) as cnt
  from ps_itm_vndr_uom_pr
) t
where cnt > 1
order by inv_item_id, effdt;