将递增值合并到此 sql

Posted

技术标签:

【中文标题】将递增值合并到此 sql【英文标题】:Incorporating an incrementing value into this sql 【发布时间】:2013-11-16 07:23:27 【问题描述】:

我正在尝试做类似question 中的第一个答案的事情,添加输出排名的@part,不知何故我无法做到正确。

我使用的sql是:

select child.id, child.perCent
from likesd parent
join likesd child
   on parent.id = child.parent
where parent.type = 3
order by parent.id, child.perCent desc;

我有些无法将@ 部分放入上述 sql 中,需要帮助。

SELECT    first_name, // This sql is from the previous question
          age,
          gender,
          @curRank := @curRank + 1 AS rank
FROM      person p, (SELECT @curRank := 0) r
ORDER BY  age;

所以:

select child.id, child.perCent, @curRank := @curRank + AS rank
    from likesd parent, (SELECT @curRank := 0) r
    join likesd child
       on parent.id = child.parent
    where parent.type = 3
    order by parent.id, child.perCent desc;

最后,我想要达到的目标是期望的结果。你知道我该怎么做吗?

主表

"id"    "type"  "parent"    "country"   "votes" "perCent"
"24"    "1"     "1"         "US"        "30"    "0"
"25"    "3"     "24"        "US"        "30"    "0"
"26"    "10"    "25"        "US"        "15"    "50.00"
"27"    "10"    "25"        "US"        "10"    "33.33"
"28"    "10"    "25"        "US"        "5"     "16.66"

"29"    "1"     "1"         "US"        "50"    "0"
"30"    "3"     "29"        "US"        "50"    "0"
"31"    "10"    "30"        "US"        "20"    "40.00"
"32"    "10"    "30"        "US"        "15"    "25.00"
"33"    "10"    "30"        "US"        "15"    "35.00"

预期结果:

"id"    "perCent" "rank" // Rank is calculated based on the sql order above
"26"    "50.00"   "1" 
"27"    "33.33"   "2"
"28"    "16.66"   "3"

"31"    "40.00"    "1" // New parent, new ranking
"33"    "35.00"    "2"
"32"    "25.00"    "3"

【问题讨论】:

为什么结果中会出现 31、32 和 33?他们的 parent = 29,其类型是 1,而不是 3。 @Barmar 对不起,我的错。我对数据进行了编辑。发布所有内容会让其他人感到困难。 【参考方案1】:
select id, perCent, 
       @curRank := if(parent = @prevParent, @curRank + 1, 1) AS rank,
       @prevParent := parent
from (
    select child.id, child.perCent, child.parent
    from likesd parent
    join likesd child
       on parent.id = child.parent
    where parent.type = 3
    order by parent.id, child.perCent desc) x
cross join (SELECT @curRank := 0, @prevParent := null) r

FIDDLE

【讨论】:

:-) 这给出了一个连续的排名。就像我取得的成就一样。这个想法是从每个父子的 1 开始(就像在期望的结果中一样)。我已经更正了 31,32,33 父母错误的问题。 更新了按父母排名的答案。 谢谢,巴里。我可以看到使用基本 sql 是不可能的。【参考方案2】:

试试这个:

select child.id, 
       child.perCent, 
       CASE parent.id 
      WHEN @curParent THEN @curRank := @curRank + 1 
      ELSE @curRank := 1 AND @curParent := parent.id  END as Rank
from  likesd parent, likesd child, (SELECT  @curParent := 0, @curRank := 0) r
where parent.id = child.parent
and   parent.type = 3
order by parent.id, child.perCent desc;

【讨论】:

您的 sql 中的 AS 等级有一个错误,从过去 10 分钟开始我无法理解。有什么想法吗? 像我一样工作。但这不是想法。查看所需的结果。需要为每个父母重置排名。这也是我卡住的地方。 效果很好。只是一个小问题,你已经偏离了我原来的 sql。你的 sql 和我的 sql 会输出相同的结果,对吧?不会有问题... 是的,我已经使用了您的查询,只是更改了连接条件

以上是关于将递增值合并到此 sql的主要内容,如果未能解决你的问题,请参考以下文章

合并两个查询以获取 SQL 中的合并值

Impala SQL 将多个值合并为 1

剑指offer十六之合并两个排序的链表

C语言单链表合并

sql [sql]将多行合并并组合成一个,同时用其他数据替换NULL值。

PySpark 或 SQL:消耗合并