sql - 数据库 |找到倍数(扭曲?!)

标签 sql sql-server tsql sql-server-2012

代码

CREATE TABLE #Temp (ValA varchar(10) NULL, FK_ID int)
INSERT INTO #Temp
SELECT 'A',1
UNION ALL
SELECT 'A',1
UNION ALL
SELECT 'A',1
UNION ALL
SELECT 'A',2
UNION ALL
SELECT 'B',1
UNION ALL
SELECT 'B',2
UNION ALL
SELECT 'C',1
UNION ALL
SELECT 'C',1
UNION ALL
SELECT 'C',1

SELECT 
ValA
, FK_ID
, CASE WHEN COUNT(*) OVER (PARTITION BY ValA, FK_ID) > 1 THEN 1
       ELSE 0
  END IsMultiple 
FROM #Temp

DROP TABLE #Temp

电流输出

ValA    FK_ID   IsMultiple
A   1   1
A   1   1
A   1   1
A   2   0
B   1   0
B   2   0
C   1   1
C   1   1
C   1   1

期望的输出

ValA    FK_ID   IsMultiple
A   1   1
A   1   1
A   1   1
A   2   **1**
B   1   0
B   2   0
C   1   1
C   1   1
C   1   1

目标 我想找到由 ValA 和 FK_ID 分区的倍数,但对于那些 ValA 重复且至少有 2 个 FK_ID 重复(而至少有一个不重复)的倍数,我希望将它们标记为 1(IsMultiple)。

即ValA - A 有 4 条记录,其中 3 条记录具有相同的 FK_ID 但有一条不同的 FK_ID,整个集合应标记为 IsMultiple = 1

谢谢

最佳答案

如果FK_ID中没有NULL

SELECT 
ValA
, FK_ID
, CASE WHEN COUNT(*) OVER (PARTITION BY ValA) > 
      dense_rank() OVER (PARTITION BY ValA ORDER BY FK_ID ASC) + dense_rank() OVER (PARTITION BY ValA ORDER BY FK_ID DESC) -1    -- Get Distinct FK_ID Count
       THEN 1
       ELSE 0
  END IsMultiple 
FROM Temp

关于sql - 数据库 |找到倍数(扭曲?!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32484954/

相关文章:

sql - SQL Server 数据集中不同 ID 的计数

MYSQL 查询不允许时间戳列具有同一日期的两个值

mysql - 如何优化此查询并减少其执行时间

sql-server - SUM 和 JOIN 显示在一条记录中

sql - 在 SQL Server 中检查列的值是否为空

sql - 将列表传递给存储过程不起作用

sql-server - 插入与选择

sql - T-SQL:带有表和列参数的游标

sql - 将带有 IN/NOT IN 的 PostgreSQL 查询转换为 JOIN

sql-server - SSRS。如何在 table1_Details_Group 的右侧创建新的行组?