【发布时间】:2018-08-18 03:53:54
【问题描述】:
我的桌子看起来像这样:
+------+------+-------+------+
| ColA | ColB | ColC | ColD |
+------+------+-------+------+
| 1 | 1 | 10217 | 5 |
+------+------+-------+------+
| 1 | 2 | 10217 | 6 |
+------+------+-------+------+
| 1 | 1 | 10417 | 7 |
+------+------+-------+------+
| 1 | 2 | 10417 | 8 |
+------+------+-------+------+
| 2 | 1 | 10417 | 9 |
+------+------+-------+------+
| 2 | 2 | 10417 | 10 |
+------+------+-------+------+
如何编写一个返回一对具有以下要求的行的查询:
-
输入 ColA 值和 ColC 范围作为参数后
例如
ColA: 1 ColC: 10217 to 10417
表格应如下所示:
+------+------+-------+------+
| ColA | ColB | ColC | ColD |
+------+------+-------+------+
| 1 | 1 | 10217 | 5 |
+------+------+-------+------+
| 1 | 2 | 10217 | 6 |
+------+------+-------+------+
| 1 | 1 | 10417 | 7 |
+------+------+-------+------+
| 1 | 2 | 10417 | 8 |
+------+------+-------+------+
- 现在为特定 ColC 值的每个 ColB 配对添加 ColD 值。使用我的示例,对于 ColC 值
10217,它将是5 + 6,而 ColC 值10417将是7 + 8。 - 然后得到两个和之间的最大值。所以应该是 15 > 11。
- 最后,返回因获得上述最大值(即 15)而产生的行配对。
最终结果应该是这样的:
+------+------+-------+------+
| ColA | ColB | ColC | ColD |
+------+------+-------+------+
| 1 | 1 | 10417 | 7 |
+------+------+-------+------+
| 1 | 2 | 10417 | 8 |
+------+------+-------+------+
我只达到了最大的部分。我在尝试获取行配对时遇到了麻烦。
SELECT Max(sumD) AS maxSumD
FROM (SELECT t1.ColA, t1.ColB, sum(ColD) AS sumD
FROM (SELECT *
FROM Table1
WHERE (ColA = paramA) and (ColC between paramFromC and paramToC)) AS t1
GROUP BY t1.ColA, t1.ColB)
解决方案:使用 Ctznkane 的回答,我找到了这个(hacky)解决方案:
SELECT TOP 2 SUMMEDVALUE, ColA, ColB, ColC, ColD
FROM (SELECT A.ColA, A.ColB, A.ColC, A.ColD, (A.ColD+B.ColD) as SUMMEDVALUE
FROM Table1 A
INNER JOIN Table1 B
ON A.ColA=B.ColA AND A.ColC=B.ColC AND t1.ColB<>t2.ColB)
ORDER BY SUMMEDVALUE DESC
【问题讨论】: