gpt4 book ai didi

mysql - (如何)我可以在单个查询中按行/结果顺序对查询结果组进行编号?

转载 作者:可可西里 更新时间:2023-11-01 07:48:19 25 4
gpt4 key购买 nike

我有一个查询当前返回具有以下属性的数据:

  • 一个数字A,保证在结果中是唯一的(不是在源表中);结果按A排序,但结果中A的值不一定连续。
  • A key B 对多行重复,将它们标记为同一组的一部分。它来自与 A 相同的表。

例子:

+--+-+-+
|id|A|B|
+--+-+-+
| 5|1|2|
|15|3|2|
|12|4|5|
|66|6|5|
| 2|7|2|
+--+-+-+

我在这里看到了解释如何在结果中返回行号的答案。然而,我需要的是获得一个(最好是基于 1 的)订单号,同时为每个 B 保持不同的计数。在下表中,C 是想要的结果:

+--+-+-+-+
|id|A|B|C|
+--+-+-+-+
| 5|1|2|1|
|15|3|2|2|
|12|4|5|1|
|66|6|5|2|
| 2|7|2|3|
+--+-+-+-+

这超出了我目前的 SQL 技能,所以我将感谢任何指点。包括指向现有答案的指针!

编辑: 下面的两个答案在结果方面同样有效(使用用于排序的虚拟包装查询)。谢谢大家的帮助。哪个是最有效的查询?考虑到在我的特定用例中,从原始查询返回的行数永远不会很大(假设最多 50 行,甚至这也是一种想象)。此外,原始查询具有用于从其他关系获取数据的连接,尽管它们与排序或过滤无关。最后,所有结果都可能有相同的 B,或者每个结果都有不同的 B - 它可以是任何一种方式或介于两者之间的任何地方。

最佳答案

你基本上想要的是 RANK()功能。但是,由于它在 MySQL 中不可用,您可以使用以下方法模拟它:

SELECT *
FROM (
SELECT a, b, (CASE b
WHEN @partition THEN @rank := @rank + 1
ELSE @rank := 1 AND @partition := b END) AS c
FROM tbl, (SELECT @rank := 0, @partition := '') tmp
ORDER BY b, a
) tmp
ORDER BY a

DEMO (SQL fiddle )。

关于mysql - (如何)我可以在单个查询中按行/结果顺序对查询结果组进行编号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12109027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com