【问题标题】:Remove duplicates from a column SQL从 SQL 列中删除重复项
【发布时间】:2021-08-31 13:44:23
【问题描述】:

我对 SQL 很陌生,我想从 SQL 中的查询中删除不同的元素。

我有这个问题:

SELECT 
    LabelingTasks.SessionID, LabelingFiles.LabelingFileID, 
    LabelingFiles.Link, LabelingTasks.TaskTypeID,
    LabelingTasks.StartFrame, LabelingTasks.EndFrame,
    LabelingTasks.DataMarkingTypeID 
FROM
    LabelingTasks 
INNER JOIN 
    LabelingFiles ON LabelingTaskID = LabelingFiles.LabelingTaskID 
WHERE 
    LabelingTasks.MovieID = 10832 
    AND LabelingTasks.DataMarkingTypeID = 5 
    AND LabelingTasks.TaskTypeID = 4 
GROUP BY 
    StartFrame 
ORDER BY 
    StartFrame ASC 

输出如下所示:

Header1 Header2 Header3 Header4 StartFrame EndFrame Header7
-----------------------------------------------------------
 xxx      xxx    xxx     xxx     0          3000     xxx
 xxx      xxx    xxx     xxx    3001        6000     xxx
 xxx      xxx    xxx     xxx    3001        6000     xxx
 xxx      xxx    xxx     xxx    6001        9000     xxx

所需的输出应如下所示:

   Header1 Header2 Header3 Header4 StartFrame EndFrame Header7
   -----------------------------------------------------------
     xxx      xxx    xxx     xxx     0          3000     xxx
     xxx      xxx    xxx     xxx    3001        6000     xxx
     xxx      xxx    xxx     xxx    6001        9000     xxx

【问题讨论】:

  • 请将xxx替换为实际值。
  • SELECT DISTINCT 只返回 3 行以上,因为所有其他列的值 'xxx'。您隐藏数据的事实意味着它不能代表问题。
  • @TimBiegeleisen,这些标题无关紧要:)
  • @jack Tim 指的是您的混淆数据;如前所述,select distinct 是您问题的答案。
  • 对于StartFrame3001,您有两个不同的行。你想保留这两个中的哪一个? SELECT max(header1), max(header2), max(header3), max(header4), startframe, endframe, max(header7) FROM ... GROUP BY startframe, endframe; 会成功吗?

标签: sql sql-server distinct


【解决方案1】:

我假设样本数据集中的“xxx”表示对手头的问题不重要但列必须构成输出部分的任何值。此外,假设 StartFrame 和 EndFrame 值对仅重要。

您真正想要的输出是具有不同 StartFrame-EndFrame 值的行列表。

下面的 SQL 将产生所需的结果,前提是 LabelingTasks.LabelingTaskID 是 StartFrame-EndFrame 值的所有值的唯一标识符。

SELECT 
    LabelingTasks.SessionID, LabelingFiles.LabelingFileID, 
    LabelingFiles.Link, LabelingTasks.TaskTypeID,
    LabelingTasks.StartFrame, LabelingTasks.EndFrame,
    LabelingTasks.DataMarkingTypeID 
FROM
    LabelingTasks 
INNER JOIN (
    SELECT LabelingTasks.StartFrame, LabelingTasks.EndFrame,
           MIN(LabelingTasks.LabelingTaskID) AS UID
    FROM LabelingTasks 
    GROUP BY LabelingTasks.StartFrame, LabelingTasks.EndFrame
) U ON U.UID = LabelingTasks.LabelingTaskID
INNER JOIN 
    LabelingFiles ON LabelingTaskID = LabelingFiles.LabelingTaskID 
WHERE 
    LabelingTasks.MovieID = 10832 
    AND LabelingTasks.DataMarkingTypeID = 5 
    AND LabelingTasks.TaskTypeID = 4 
GROUP BY 
    StartFrame 
ORDER BY 
    StartFrame ASC

【讨论】:

    【解决方案2】:

    请检查,第 2 行和第 3 行不是唯一的(我认为 SessionID 是问题所在)。如果每列中的所有其他条目都是唯一的,则您当前的语句将起作用,因为 distinct-statement 将过滤掉所有重复项。

    【讨论】:

      【解决方案3】:

      请试试这个

      SELECT DISTINCT(LabelingTasks.StartFrame, LabelingTasks.EndFrame),  LabelingTasks.SessionID,LabelingFiles.LabelingFileID, LabelingFiles.Link, LabelingTasks.TaskTypeID ,LabelingTasks.DataMarkingTypeID 
      FROM LabelingTasks 
      INNER JOIN LabelingFiles ON LabelingTasks.LabelingTaskID=LabelingFiles.LabelingTaskID 
      WHERE LabelingTasks.MovieID=10832 AND LabelingTasks.DataMarkingTypeID=5 AND LabelingTasks.TaskTypeID=4 GROUP BY StartFrame ORDER BY StartFrame ASC 
      

      如果它不起作用,请告诉我

      【讨论】:

      • DISTINCT() 不是函数。它适用于查询中的所有列。
      • 列 'LabelingTasks.SessionID' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2015-09-30
      • 2014-09-30
      • 2014-07-03
      • 1970-01-01
      相关资源
      最近更新 更多