【问题标题】:Using GROUP BY, select ID of record in each group that has lowest ID使用 GROUP BY,选择每个组中 ID 最低的记录 ID
【发布时间】:2016-03-11 07:13:36
【问题描述】:

我正在创建一个文件组织系统,您可以在其中将内容项添加到多个文件夹。 我将数据存储在具有类似于以下结构的表中:

ID       TypeID    ContentID    FolderID
1         101        1001          1
2         101        1001          2
3         102        1002          3
4         103        1002          2
5         103        1002          1
6         104        1001          1
7         105        1005          2

我正在尝试为每个唯一的 TypeID 和 ContentID 对选择第一条记录。对于上表,我希望结果是:

ID
1
3
4
6
7

如您所见,101 1001 和 103 1002 对分别添加到两个文件夹中,但我只想要它们添加到的第一个文件夹的记录。

但是,当我尝试以下查询时,我只得到至少有两个条目具有相同 TypeID 和 ContentID 的结果:

select MIN(ID)
from table
group by TypeID, ContentID

结果

ID
1
4

如果我将MIN(ID) 更改为MAX(ID),我会得到正确数量的结果,但我会得到添加到最后一个文件夹而不是第一个文件夹的记录:

ID
2
3
5
6
7

我使用GROUP BYMIN 错了吗?还有其他方法可以完成选择每个 TypeID ContentID 对的第一条记录的任务吗?

【问题讨论】:

  • min() 更改为max() 不应更改返回的行数。
  • 如果我添加ORDER BY ID,您的SELECT MIN(ID) 查询将为我返回预期结果。两种情况下的行数都是 5。
  • @GordonLinoff 我知道 min() 和 max() 不应该返回不同数量的行,因此我的问题。

标签: sql sql-server select group-by min


【解决方案1】:

MIN()MAX() 应该返回相同数量的行。更改函数不应更改查询中返回的行数。

这个查询是更大查询的一部分吗?通过查看提供的示例数据,我会假设此代码只是您尝试执行的更大操作的 sn-p。您以后是否尝试将TypeIDContentIDFolderID 与ID 所引用的表连接起来?
如果是,则此错误可能是由查询的另一部分而不是此 select 语句引起的。如果您使用连接或多级选择语句,如果引用表不包含所有外部 ID 的记录,您可以获得不同数量的结果。

另一个建议,检查您的记录中是否有任何值是NULL。虽然这不应该影响GROUP BY,但我在处理NULL 值时有时会遇到奇怪的行为。

【讨论】:

    【解决方案2】:

    使用 ROW_NUMBER

    WITH CTE AS
    (SELECT ID,TypeID,ContentID,FolderID,
    ROW_NUMBER() OVER (PARTITION BY TypeID,ContentID ORDER BY ID) as rn FROM t
    )
    SELECT ID FROM CTE WHERE rn=1
    

    【讨论】:

    • 你能详细解释一下吗?这如何为我提供每对的所有第一个 ID 的列表?
    • @TotZam sql server 有这个漂亮的函数msdn.microsoft.com/en-us/library/ms186734.aspx,例子很好地展示了它是如何工作的。编辑只得到 ID 列
    【解决方案3】:

    与 ORDER BY 一起使用:

    select *
    from table
    group by TypeID, ContentID
    order by id
    

    SQLFiddle:http://sqlfiddle.com/#!9/024016/12

    【讨论】:

      【解决方案4】:

      尝试使用first ( id) 而不是min(id)

      select first(id)
      from table 
      group by TypeID, ContentID
      

      有效吗?

      猜你喜欢
      • 1970-01-01
      • 2021-01-20
      • 2022-08-11
      • 2021-11-09
      • 2021-08-02
      • 2020-06-21
      • 2018-09-18
      • 2022-11-26
      • 2021-01-23
      相关资源
      最近更新 更多