SQL:如何根据应用于其他两列的条件聚合一列的值


ID                COL1    COL2    DATE    DATE2       RES
P4579841254       10      20  01/02/1900  01/04/1914  10
P4579841254       20      25  01/03/1907  02/08/1918  57
P4579841254       30      31  01/04/1914  03/12/1922  459
P4579841254       70      71  01/05/1921  05/04/1927  7895
P4579841254       70      71  01/06/1921  05/06/1927  2497
P4579841254       71      20  01/06/1928  06/08/1931  1256
P4579841254       20      75  01/07/1935  07/12/1935  325987

你好,Comm,我想通过以下条件来计算col[RES]的和:

COL1>=70和DATE1>=最小(DATE1(

COL2<=75和DATE2<=最大(DATE2(

带有,

COL1=70 时的最小值(DATE1(

COL2=75 时的最大值(DATE2(

换句话说,我想要:"如果我们有多个COL1=70,我们只取得到MIN(DATE(的那个,对于COL2=75,我们取显示COL2=75的所有行的MAX(DATE;

对于此ID,结果应为335138(第4行、第6行和第7行的总和(我尝试了以下几行,但当我必须将这些SELECT插入到其他上游SELECT中时,这对我和我的SQL级别(目前(来说都变得很复杂,最终可以通过ID进行分组:(

(SELECT "DT_MIN" FROM
(SELECT "ID",MIN("DATE1") as DT_MIN
FROM "MY_TABLE"
GROUP BY "ID","DATE1","COL1","COL2"
HAVING  ("COL1"='70')
)) as "DT_MIN_vf",
(SELECT "DT_MAX" FROM
(SELECT "ID",MAX("DATE2") as DT_MAX
FROM "MY_TABLE"
GROUP BY "ID","DATE2","COL1","COL2"
HAVING ("COL2"='75')
))as "DT_MAX_vf"

需要您的帮助专家!

这会给您带来预期的结果,但我不确定我是否完全理解需求。请看一看,如果我误解了什么,请告诉我。

WITH 
min_d AS
(SELECT min(m2.date1) d FROM mytable m2 WHERE m2.col1 = 70),
max_d AS
(SELECT max(m2.date2) d FROM mytable m2 WHERE m2.col2 = 75)
SELECT id, SUM(res)
FROM mytable
WHERE 
date1 >= (SELECT d FROM min_d)
AND (col1 <> 70 OR date1 = (SELECT d FROM min_d)) -- Handles the special case to only include the col1=70 row where date1=min_d, but unclear if it needs to be more general
AND date2 <= (SELECT d FROM max_d)
GROUP BY id

顶部的两个CTE可以获得您想要的最短和最长日期。这只是为了避免在查询中重复它们,但没有理由必须是CTE。

我有(col1 <> 70 OR ...)的特殊情况,以确保它只包括col1=70的情况,其中date1=min_d。我完全不相信我能理解这个规则,但这确实给了你想要的结果。

您会注意到,尽管您在问题中提到了COL1 >= 70COL2 <= 75,但它们并没有出现在此处的任何位置。您已经说过应该为col1=70(而不是>=(计算min(date1),并且您已经说过尽管col1是<70,所以我不确定COL1 >= 70COL2 <= 75在哪里相关。

最新更新