如何获得组成GROUP BY ... HAVING查询的行的ID?
我有以下查询查找从同一个客户中取消自己的交易(有些交易为负数)。如何获得组成GROUP BY ... HAVING查询的行的ID?
SELECT c, ABS(r) magnitude, SUM(r) total, COUNT(*) num
FROM table
GROUP BY c, magnitude
HAVING num > 1 AND total = 0
ORDER BY total
此查询的结果是客户ID,订单的大小,即取消自己出(零)订单的总和,并且一起加起来零成交的数量。
我该如何去取得组成COUNT(*)
的行ID?
我想结束包含这些行的ID的单列结果集。
SELECT id
FROM (
SELECT c, ABS(r) magnitude, SUM(r) total, COUNT(*) num
FROM table
GROUP BY
c, magnitude
HAVING num > 1 AND total = 0
) td
JOIN table to
ON to.c = td.c
AND to.r IN (magnitude, -magnitude)
上(c, r)
创建索引将改善查询。
在SQL Server
,Oracle
和PostgreSQL 8.4
你也可以做到以下几点:
SELECT id
FROM (
SELECT id,
SUM(r) OVER (PARTITION BY c, ABS(r)) total,
COUNT(*) OVER (PARTITION BY c, ABS(r)) num
FROM table
) q
WHERE num > 1 AND total = 0
出于某种原因,我认为标签说MySQL。我很愚蠢。
你可能要考虑的group_concat功能,这将让你有一列是所有在列表中连接在一起的组中的ID。
这对于阅读列表的人来说并不会有用。如果你想根据结果做更多的查询或计算,那么这不是一个好的选择。
但基本上你可以做这样的事情:
SELECT c, ABS(r) magnitude, SUM(r) total, COUNT(*) num,
GROUP_CONCAT(ID SEPARATOR ', ') id_list
FROM table
GROUP BY c, magnitude
HAVING num > 1 AND total = 0
ORDER BY total
我不使用MySQL,所以这不会是我的解决方案,但它可能会帮助别人。谢谢! – 2009-09-22 14:24:26
我应该多加注意。我可以发誓我看到了一个MySQL标签。我一定在同一时间看另一个问题。我希望稍后有人能够使用它。 – Welbog 2009-09-22 14:26:41
第二个查询也可以在Sybase SQL Anywhere上运行,这正是我所处的。但是,它会返回一个空的结果集。如果从总列中的SUM()中移除ABS()函数,它将按需要工作。如果你总结'ABS()','total'不能为零。 – 2009-09-22 14:38:19
我按照上面所述编辑了查询。 – 2009-09-22 14:39:01