【问题标题】:How do I group a query after ordering it?订购后如何对查询进行分组?
【发布时间】:2011-03-07 21:52:37
【问题描述】:

我正在尝试在订购后对查询进行分组,但是,在 sql(我使用 DB2)中,我们无法在订购后进行分组,但如果我在分组更改分组后订购。这样做的原因是因为它基于多个属性而不只是 1 分组(我只需要按 1 个属性分组,但由于我们需要匹配 select 语句,所以我必须按多个属性分组。

我尝试使用“with”创建一个虚拟表并尝试在其中排序,但 DB2 说我只能在 with 属性中分组而不是排序

from 语句也是如此。我尝试在 from 属性内进行嵌套查询,该查询返回有序结果,但 DB2 限制我们在 from 属性内进行排序(只允许分组)

所以我不知道该怎么做,订购后如何分组?

这是一个示例表:

口袋妖怪:

id name age
3 pikachu 1
2bulbasure 3
1 charazard 2
11 pikachu 10

(在口袋妖怪表中)
主键 ID,名称
外键(名称)引用 pokedex(名称))

图鉴:

身份状态
皮卡丘
charazard 疱疹
打嗝

现在我要做的是列出口袋妖怪表: 按年龄、姓名排序
但在那之后,我希望结果按他们的 id 分组,但是我选择他们的 id、姓名、年龄和状态,所以在分组时我必须匹配这些属性:
GROUP BY pokedex.id 年龄状态.....
所以问题是如果我在分组后订购它会破坏 pokedex.id 的分组,因为它也按状态和其他属性分组
只是一个例子,并没有真正构建任何与口袋妖怪相关的东西:P

【问题讨论】:

  • 一些有关您的数据/结构的信息将大大增加获得有用答案的机会
  • Group by 通常在 order by 之前完成。您能否将您当前的查询粘贴给我们以提供帮助。
  • 在分组之前订购是没有意义的。 GROUP BY 不依赖于任何固有顺序,除非您使用的是 MySQL(标记),但您的描述是 DB2。 * Mysql 是另一回事,允许非聚合与 GROUP BY 混合
  • 但是您对 group by 的限制是它必须与您的 select 语句中的相同属性匹配,因此如果先 group by 然后 order by,由于某些分组属性上的常见分组,该组将中断。
  • @Richard aka cybekiwi 如果说您有一个根据实际顺序过滤数据的位置,这可能是有道理的。 (或某种限制)。

标签: mysql sql db2


【解决方案1】:

如果您想对不想 GROUP BY 的变量进行 ORDER BY,我可以看出这可能是个问题。在 GROUP BY 语句中不包括某些变量会从结果表中删除这些列,因此您将无法按它们排序。

在您的示例中,您可能想要显示给定口袋妖怪有多少次处于某种状态,如下所示:

SELECT
   p.name
   ,d.status
   ,count(*) tally
FROM pokemon p
   INNER JOIN pokedex d on p.name=d.id
GROUP BY
   p.name
   ,d.status

您无法按“年龄”对上述查询结果进行排序,因为您没有按姓名、状态、年龄分组。

在这个例子中,我会这样做:

SELECT
   p.age
   ,p.name
   ,d.status
   ,count(*) tally
FROM pokemon p
   INNER JOIN pokedex d on p.name=d.id
GROUP BY
   p.age
   ,p.name
   ,d.status

但是,就您而言,并非总是可以在“分组依据”子句中包含您希望对数据进行排序的那些列。因此,以您的 Pokemon 数据/表格为例,让我说明一种可能有用的通用方法:

1) 首先,我将使用我的自定义排序创建一个表格:

选择 * ,ROW_NUMBER() 作为 my_order 从 ( 选择 年龄 ,姓名 来自口袋妖怪 订购方式 年龄 ,姓名 )

2) 然后,我会将它加入我的分组表的其余部分,按为此目的创建的自定义“my_order”列进行排序:

选择 一种。* ,custom.my_order FROM a - 在您加入/分组后,我将您的表称为“a” 内部联接 ( 选择 姓名 ,ROW_NUMBER() 作为 my_order 从 ( 选择 年龄 ,姓名 来自口袋妖怪 订购方式 年龄 ,姓名 ) ) 作为自定义 ON a.name=custom.name 按 custom.my_order 订购

这是我的“排序后分组”的版本,虽然我不这么认为 - 我认为它是“自定义”排序。

【讨论】:

  • 如何创建自定义表 1) 如果我使用它不允许使用 order by
  • 您是说运行查询以产生结果 1) 会返回错误吗?任何子选择中都不允许存在“order by”?您看到的确切错误是什么?您编写的类似于上面 1) 的代码是什么?
  • 在 db2 中,您不能在嵌套表或虚拟表中进行排序,这会给出无效令牌错误
  • @Saad,不确定您运行的是哪个版本的 DB2,但至少有一个版本具有此功能:DB2 for z/OS SQL Reference (7.68 MB) -> 然后,转到“子选择示例”,参见示例 12,其中包含一个“ORDER BY”子句作为子选择的一部分。
  • @Saad, the official DB2 forums 可能也是一个不错的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 2016-03-02
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多