【问题标题】:SQL - Multiple duplicates in some columns, 1 column has to be uniqueSQL - 某些列中有多个重复项,1 列必须是唯一的
【发布时间】:2019-03-01 06:04:48
【问题描述】:

我对 SQL 很陌生,非常感谢我正在从事的项目能在这方面提供一些帮助。我正在使用 SQLite,不确定这是否会有所不同!

如果 3 列相同但 1 列不同,我需要编写一个输出一行的查询。

第 2、3 和 4 列的组合必须在另一行中有重复项,

但是

第 1、2、3 和 4 列的组合不得在任何其他行中有任何重复。

示例数据库:

ROW 1 : 12345 | Test1 | Something1 | And1  (I don't want this, it's a full row duplicate with row 2)

ROW 2 : 12345 | Test1 | Something1 | And1  (I don't want this, it's a full row duplicate with row 1)

ROW 3 : 12344 | Test1 | Something1 | And3  (I don't want this, it's not a full row duplicate but col 2, 3 and 4 combined doesn't exist anywhere else in the table)

ROW 4 : 12222 | Test2 | Something1 | And2  (I want this! It's not a full row duplicate and columns 2, 3 and 4 combined exists in row 9) 

ROW 5 : 12222 | Test3 | Something1 | And3

ROW 6 : 12222 | Test3 | Something1 | And3

ROW 7 : 12224 | Test3 | Something1 | And3

ROW 8 : 12222 | Test3 | Something2 | And3

ROW 9 : 12000 | Test2 | Something1 | And2

我想要的输出是:

12222 | Test2 | Something1 | And2

12224 | Test3 | Something1 | And3

12000 | Test2 | Something1 | And2

我希望这对某人有意义。提前感谢您的帮助。

【问题讨论】:

  • 您的预期输出实际上没有意义。输入表中没有12222 | Test2 | Something1 | And2记录。
  • 到目前为止你尝试了什么?
  • 感谢您的评论,我会调整它。
  • @Aldeguer 我已经尝试了太多,无法提及所有内容
  • @TimBiegeleisen 现在我已经改变了它。你想象的输出是我应该放的吗?

标签: sql sqlite duplicates unique


【解决方案1】:

我想你想要not exists:

select t.*
from t
where exists (select 1
              from t t2
              where t2.col2 = t.col2 and t2.col3 = t.col3 and t2.col4 = t.col4 and
                    t2.col1 <> t.col1
             );

【讨论】:

  • 感谢您的帮助,但这并不完全是我想要的。可能是我的错,因为我输入了错误的输出......没有帮助!使用此查询,我仍然会在整个行中得到重复。
【解决方案2】:

我们可以加入一个标识重复组的子查询,并限制使用它:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT col2, col3, col4
    FROM yourTable
    GROUP BY col2, col3, col4
    HAVING COUNT(*) = COUNT(DISTINCT col1) AND COUNT(*) > 1
) t2
    ON t1.col2 = t2.col2 AND t1.col3 = t2.col3 AND t1.col4 = t2.col4;

Demo

【讨论】:

  • 你的逻辑对我来说毫无意义,我不会改变我的答案,因为我已经实现了你在问题中描述的逻辑。如果您期望不同结果,请编辑您的问题并清楚地告诉我们逻辑是什么。这里的重点不是让每个人都跳舞,直到有人猜出一个“正确”的查询,而是提出一个正确的问题。
【解决方案3】:

试试这个:

select 
col1,
col2,
col3,
col4
from (
SELECT 
*,
LEAD(valid, 1, 1) OVER (PARTITION BY col2, col3, col4 ORDER BY col1) as valid_next,
LEAD(invalid, 1, 1) OVER (PARTITION BY col2, col3, col4 ORDER BY col1) as invalid_next
FROM (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY col2, col3, col4 ORDER BY col1) AS valid,
ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY col1) AS invalid
FROM tb1
) x ) y
where valid <> valid_next and invalid = invalid_next
ORDER BY col1;

这里的逻辑是创建两列(validinvalid)来统计1)3个重复列和2)4个重复列的出现。然后使用lag 跟踪更改。如果有变化,那么我们就知道有重复,否则该行对于分区的列将是唯一的。

输出表:

+--------+--------+-------------+------+
| col1   | col2   |    col3     | col4 |
+--------+--------+-------------+------+
| 12000  | Test2  | Something1  | And2 |
| 12222  | Test2  | Something1  | And2 |
| 12224  | Test3  | Something1  | And3 |
+--------+--------+-------------+------+

【讨论】:

  • 非常感谢拉里,这看起来更像我所追求的。我稍后会尝试一下,然后回复你让你知道
  • 这假设 OP 的 SQLite 版本支持ROW_NUMBER
  • 我使用的是 SQLite 3.15
  • 不确定我是否做错了什么,但我无法让它工作。 tb1 应该是我的表名吗?我不确定我应该在哪里说我使用的是什么表?
  • 是的,tb1 是表名。错误信息是什么?如果您的 sqlite 不支持 row_number,请尝试 Tim 的查询,否则该查询应该可以工作。
猜你喜欢
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2017-12-05
  • 2012-08-16
  • 2018-09-11
  • 2023-01-30
  • 2016-12-16
  • 1970-01-01
相关资源
最近更新 更多