SQL查询帮助:如何根据同一查询中的某些条件评估value / max(value)

问题描述 投票:1回答:2

不是SQL专家。我正在使用带有EF迁移的postgres数据库。坚持这个要求。在这里。

我的桌子是这样的:

A   B   C   D

20  1   1   1   

59  0   0   1

57  1   1   1

10  1   0   0

30  1   1   1

15  0   0   0

行的顺序类似于最旧到最新(从上到下)。

我从项目中得到的一半查询如下:

SELECT  dcr."A"
FROM "DCR" dcr 
    LEFT JOIN "DCM" dcm ON "Id" = dcm."DCRID"
    LEFT JOIN "DC" dc ON dc."Id" = dcm."DCID" 
WHERE dcr."B" != 0
AND dcr."C" != 0
AND dcr."B" != 0
ORDER BY "UtcDate" desc
limit(1)

这将在匹配条件时获取最新A的第一部分值。但不是Max部分和分区部分,如下所述。

我想找到((最新的A,其中B = C = D = 1除以其先前行中的最大值A,其中B = C = D = 1)-1)* 100。

我希望这在单个查询中发生,并且有多个这样的组。假设该表包含大约60行,我们可以根据其他列对它们进行分组。每个小组应评估上述公式。

以上示例的预期结果应为:

result = ((30 / 57) - 1) * 100 = (0.5263 - 1) * 100 = -47.73
sql postgresql
2个回答
1
投票

您可以使用子查询来获取最大值。我不知道你为什么要用这种奇怪的风格编写查询,但我会保留它:

SELECT  dcr."A" / (SELECT MAX("A")
                   FROM "DCR"
                   WHERE dcr."B" != 0
                     AND dcr."C" != 0
                     AND dcr."D" != 0)) - 1) * 100
FROM "DCR" dcr 
    LEFT JOIN "DCM" dcm ON "Id" = dcm."DCRID"
    LEFT JOIN "DC" dc ON dc."Id" = dcm."DCID" 
WHERE dcr."B" != 0
AND dcr."C" != 0
AND dcr."D" != 0
ORDER BY "UtcDate" desc
limit(1)

0
投票

也许是这样的? select (t1."A"/max(t2."A"))*100 from (select row_number() over() as id,* from t where t."A"=1 and t."B" =1 and t."C"=1 ) as t1 join (select row_number() over() as id,* from t where t."A"=1 and t."B" =1 and t."C"=1 ) as t2 on t1.id>t2.id group by t1."A",t1."E"

© www.soinside.com 2019 - 2024. All rights reserved.