【问题标题】:Fetch data by joining the same table rows based on some id通过基于某个 id 连接相同的表行来获取数据
【发布时间】:2017-05-24 04:52:58
【问题描述】:

我有一张桌子

我想获取行为area,area_name,city_size1rate,city_size2rate,city_size3rate 基于area的分组

最好的方法是什么

【问题讨论】:

  • 在查询中使用 group by 子句。
  • 会不会只有 3 个不同的 city_size?还要以表格格式发布数据,并清楚地提及预期输出。
  • 请向我们展示您的预期输出。我不清楚你想要什么。
  • @Utsav 大多只有 3 个城市规模可能会改变

标签: mysql sql database hql


【解决方案1】:

如果只有 3 个不同的 city_size,你可以像下面那样做。 假设AREA_NAME 对于相同的area 也是相同的。

select area,area_name
,max(case when city_size=1 
        then rate 
        else null end
    ) as city_size_1_rate
,max(case when city_size=2 
        then rate 
        else null end
    ) as city_size_2_rate
,max(case when city_size=3 
        then rate 
        else null end
    ) as city_size_3_rate   
from your_table
group by area,area_name;    

解释:case when city_size=1 then rate else null end 只会给你rate city_size=1 否则它会给你null。而当您group byarea 并选择max 或以上值时,您将只得到非空rate,即city_size_1_rate。其他 2 列也是如此。

【讨论】:

  • 但是我不能选择 area_name 因为它是针对聚合查询的
  • 不确定您的意思。 area_name 在输出中。为什么要再次选择它?
  • area_name 在输出中
  • 我的输出将与您的输出相同。请运行我给出的确切查询,然后告诉我问题出在哪里。
  • 您的查询是正确的,但如果再增加一个城市规模,我不能保证最大城市规模为 3 怎么办
【解决方案2】:

你应该在这里使用 group by

SELECT area,area_name,city_size1 rate,city_size2 rate,city_size3 rate FROM your_table_name GROUP BY area;

group by 可以这样执行:

  • 扫描整个表,将area的每个值存储在一个 哈希表
  • 返回哈希表的键

因此优化了速度,但可能需要大量内存。

【讨论】:

    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2021-10-16
    • 2018-12-21
    • 1970-01-01
    • 2019-02-27
    相关资源
    最近更新 更多