如何在新视图中按新索引分组

Posted

技术标签:

【中文标题】如何在新视图中按新索引分组【英文标题】:How to GROUP BY a new index in a new VIEW 【发布时间】:2015-05-14 02:42:04 【问题描述】:

我有 2 个表(负载 + 道路),我想创建一个新视图,通过创建新列(标志)来索引行的 COUNT,然后按这个新索引进行分组。 我试过这个:(但它不起作用)

sprintf(my_cmd, 
"CREATE VIEW myVIEW(id, Rlength, Llength, flag) AS "
"SELECT road.id, road.length, load.length, COUNT(*) AS flag 
FROM road, load "
"WHERE road.id=load.id; "
"SELECT id, Rlength, Llength 
FROM myVIEW"
"GROUP BY flag");

错误: 执行查询时出错:错误:列“road.id”必须出现在 GROUP BY 子句中或用于聚合函数中

我正在使用我的 SQL。

*编辑:

我不希望新列(标志)出现在最后一个 SELECT 中,但我想按它分组.. 不知道是否可以完成。如果没有,我想达到的事情是在“SELECT id,Rlength,Llength”上使用 group by 并将所有行放在一个组中,但是我在这些行之间没有 Common 参数,所以我试图添加这个“标志”

完整代码(抱歉问题太长):

sprintf(my_cmd, 
"CREATE VIEW myVIEW3(id, Rlength, Llength, flag) AS"
" SELECT road.id, road.length, load.length, COUNT(*) AS flag 
FROM road, load"
" WHERE road.id=load.id;"
" SELECT id, Rlength, Llength FROM myVIEW3"
" GROUP BY flag"
" HAVING COUNT(*) <= %d"
" ORDER BY (CAST(Llength AS float) / CAST(Rlength AS float)) DESC, id DESC",k);

而我正在尝试做的是在不使用 LIMIT/TOP (它的分配)的情况下进行一些 ORDER 后获取前 k 行。所以我尝试使用带有一些指示符的新 VIEW,我将使用这些指示符将所有行分组为一组,然后使用 HAVING COUNT(flag)

道路:

.---------------------------------------------------------- |身份证 |长度 |速度 | .--------.--------------------------------------------------

| 9 | 55 | 90 |

| 10 | 44 | 80 |

| 11 | 70 | 100 |

加载:

.---------------------------------------------------------- |身份证 |长度 |速度 | .--------.--------------------------------------------------

| 9 | 10 | 20 |

| 10 | 15 | 30 |

| 11 | 30 | 60 |

命令: loadRanking 2 (k=2,所以我想在某个 ORDER 之后得到前 2 行,我们先不讨论这个结果中的 ORDER)

结果:

.---------------------------------------------------------- |身份证 |长度 |速度 | .--------.--------------------------------------------------

| 9 | 10/55 | 20/90 |

| 10 | 15/44 | 30/80 |

【问题讨论】:

你真的应该向我们展示一些你想要得到的样本输出。否则,我们无法确定地向您提供查询。 好的,我会编辑的。谢谢 【参考方案1】:

您的 group by 应包含所有被选中但不属于聚合函数的列。所以你的 GROUP BY 应该是这样的:

GROUP BY road.id, road.length, load.length

话虽如此,我很困惑为什么您在这里有两个查询。我怀疑您的查询应该是这样的:

SELECT road.id, road.length, load.length, COUNT(*) AS flag 
FROM road, load 
WHERE road.id=load.id
GROUP BY road.id, road.length, load.length
HAVING COUNT(*) <= %d
 ORDER BY (CAST(load.length AS float) / CAST(road.length AS float)) DESC, road.id DESC

The GROUP BY Statement

附加说明:在将其放入视图之前,请尝试确保您的查询有效。

【讨论】:

哦,你想要每个 id 的最小值和最大值吗?让我看看我能为你解决什么问题。 这与 id 无关...我只想在不使用 LIMIT 的情况下获得前 k 行 我没有足够的代表来回复您的原始帖子。我还是不太明白你想要什么。速度从何而来?你只是想把两张桌子结合起来吗?为什么 id of 11 没有包含在结果中?我想如果你发布了实际的作业问题,我可以指导你正确的方向。 问题是否可能希望您使用 php 来限制结果?像这样的东西? http://***.com/a/17070820/3843101 我想在不使用 LIMIT 的情况下进行限制,是的。但什么是 PHP?我在 c 中使用我的 SQL。

以上是关于如何在新视图中按新索引分组的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 如何在新视图中链接 ForEach 索引和照片索引?

pandas DataFrame中按日期(在索引中)的加权平均分组(每列不同的操作)

如何在 presto SQL 中按月分组

如何在 BigQuery 中按外键分组?

如何在 Pandas 数据框中按列值分组

如何在python中按模式分组? [复制]