【问题标题】:SQL SELF JOIN eliminate duplicated valuesSQL SELF JOIN 消除重复值
【发布时间】:2018-03-28 11:19:27
【问题描述】:

我必须选择不同的月份 ID,以下查询返回重复值。如何解决这个问题?

 SELECT DISTINCT m1.ID as C1, m2.ID as C2
    FROM Mois m1, Mois m2
    WHERE m1.ID IN('1','4','9')
    AND m2.ID IN('2','5','10')

这就是我想要得到的:

C1 | C2
1 | 2
4 | 5
9 | 10

【问题讨论】:

  • 您的预期输出和样本数据是什么。
  • 没有重复项,至少对于 both ID 列而言没有。您的预期输出是什么?
  • 你需要有一种聚合这些重复的方法(c1=1,c2=2)不同于(c1=1,c2=3)
  • c1值如何选择c2值?
  • @TimBiegeleisen 我希望每一列都包含不同的值

标签: sql sql-server reporting-services ssrs-2012


【解决方案1】:

试试这个选项:

WITH cte1 AS (
    SELECT DISTINCT m1.ID as C1, m2.ID as C2
    FROM Mois m1
    INNER JOIN Mois m2
    ON m1.ID IN (1, 4, 9) AND
       m2.ID IN (2, 5, 10) AND
       m1.ID < m2.ID
),
cte2 AS (
    SELECT C1, C2, ROW_NUMBER() OVER (PARTITION BY C1 ORDER BY C2) rn
    FROM cte1
)

SELECT C1, C2
FROM cte2
WHERE rn = 1
ORDER BY C1;

C1   C2
1   1   2
2   4   5
3   9   10

Demo

【讨论】:

  • 多么好的查询!谢谢!!
【解决方案2】:
SELECT MIN(C1),MIN(C2) FROM
(
    SELECT DISTINCT m1.ID as C1, m2.ID as C2,
    ROW_NUMBER() OVER (PARTITION BY m2.ID ORDER BY (SELECT 0)) AS ROWNUM
    FROM Mois m1
    INNER JOIN Mois m2
    ON m1.ID IN (1, 4, 9) AND
       m2.ID IN (2, 5, 10) AND
       m1.ID < m2.ID
) AS T1
GROUP BY ROWNUM

SELECT C1,C2 from
(SELECT DISTINCT m1.ID AS C1, 
    Row_number() over (Order by (SELECT 0)) AS RN
    FROM Mois m1
    WHERE m1.ID IN('1','4','9')) AS T1
INNER JOIN
(SELECT DISTINCT m2.ID AS C2,
    Row_number() over (Order by (SELECT 0)) AS RN
    FROM  Mois m2
    WHERE m2.ID IN('2','5','10')) AS T2
 ON T1.RN=T2.RN

输出

C1  C2
1   2
4   5
9   10

演示

http://sqlfiddle.com/#!18/f64e5/2

【讨论】:

  • 这取决于你对“更好”这个词的定义:-)
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 2019-10-16
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多