神谕。 Return 根据字段值正确记录
Oracle. Return correct record based on fields values
从之前的 post 开始,有人已经提供了帮助并帮助我创建了这个 select,最多 returns 1 条记录。 festpae_id
SELECT *
FROM
(
SELECT discount, osp_id, sero_id, estpt_id,
ROW_NUMBER() OVER
(PARTITION BY osp_id, sero_id, estpt_id ORDER BY festpae_id DESC) as festpae_id
FROM database1 data1
JOIN database2 data2 ON data2.id = data1.attr_id
WHERE data1.interest_rate = 1
AND data1.ordet_id = data2.id
AND data1.objt_attr_id = data2.objt_attr_id
)
WHERE festpae_id = 1
记录:
DISCOUNT OSP_ID SERO_ID ESTPT_ID FESTPAE_ID VALUE
---------- ---------- ---------- ---------- ---------- ----------
50 619356 3931831 2144 NULL 0
40 619356 3931831 2144 NULL 1
30 619356 3931831 2144 2000743 0
15 619356 3931831 2144 2000744 1
所以从那个select,我会得到这个记录
DISCOUNT OSP_ID SERO_ID ESTPT_ID FESTPAE_ID VALUE
---------- ---------- ---------- ---------- ---------- ----------
50 619356 3931831 2144 NULL 0
目前条件比较多 需要检查一下,脑子已经炸了,再加上我的oracle知识还不够好。
那我需要什么?如您所见,有 2 列,分别称为 value
和 festpae_id
。他们必须得到妥善处理。
- 如果
festpae_id is NULL
处存在记录,那么他应该检查 festpae_id is NULL
和 value = 1
处的所有记录,如果存在 return 记录。
- 如果
festpae_id is null
处没有记录,那么select应该return带有MAX(festpae_id)
的记录(在本例中使用ROW_NUMBER() ) 以及 value = 1
.
- 在其他情况下,select 应该 return 没有。
我知道,可以通过 DECODE()
完成,但我需要复制粘贴代码 不行。也许你们中的某个人可以如此友善并分享他对解决方案的想法?现在为此至少工作了 5 个小时,但找不到制作方法。
P.S 此 select 在视图 table 中用作 LEFT OUTER JOIN
。
只需调整 order by
并将 value = 1
添加到 WHERE
:
(PARTITION BY osp_id, sero_id, estpt_id
ORDER BY (CASE WHEN festpae_id IS NULL
THEN 1 ELSE 2
END),
festpae_id DESC
) as festpae_id
并且:
WHERE data1.interest_rate AND value = 1
您还可以添加WHERE
条件并将ORDER BY
简化为ORDER BY testpae_id DESC NULLS FIRST
。
从之前的 post 开始,有人已经提供了帮助并帮助我创建了这个 select,最多 returns 1 条记录。 festpae_id
SELECT *
FROM
(
SELECT discount, osp_id, sero_id, estpt_id,
ROW_NUMBER() OVER
(PARTITION BY osp_id, sero_id, estpt_id ORDER BY festpae_id DESC) as festpae_id
FROM database1 data1
JOIN database2 data2 ON data2.id = data1.attr_id
WHERE data1.interest_rate = 1
AND data1.ordet_id = data2.id
AND data1.objt_attr_id = data2.objt_attr_id
)
WHERE festpae_id = 1
记录:
DISCOUNT OSP_ID SERO_ID ESTPT_ID FESTPAE_ID VALUE
---------- ---------- ---------- ---------- ---------- ----------
50 619356 3931831 2144 NULL 0
40 619356 3931831 2144 NULL 1
30 619356 3931831 2144 2000743 0
15 619356 3931831 2144 2000744 1
所以从那个select,我会得到这个记录
DISCOUNT OSP_ID SERO_ID ESTPT_ID FESTPAE_ID VALUE
---------- ---------- ---------- ---------- ---------- ----------
50 619356 3931831 2144 NULL 0
目前条件比较多 需要检查一下,脑子已经炸了,再加上我的oracle知识还不够好。
那我需要什么?如您所见,有 2 列,分别称为 value
和 festpae_id
。他们必须得到妥善处理。
- 如果
festpae_id is NULL
处存在记录,那么他应该检查festpae_id is NULL
和value = 1
处的所有记录,如果存在 return 记录。 - 如果
festpae_id is null
处没有记录,那么select应该return带有MAX(festpae_id)
的记录(在本例中使用ROW_NUMBER() ) 以及value = 1
. - 在其他情况下,select 应该 return 没有。
我知道,可以通过 DECODE()
完成,但我需要复制粘贴代码 不行。也许你们中的某个人可以如此友善并分享他对解决方案的想法?现在为此至少工作了 5 个小时,但找不到制作方法。
P.S 此 select 在视图 table 中用作 LEFT OUTER JOIN
。
只需调整 order by
并将 value = 1
添加到 WHERE
:
(PARTITION BY osp_id, sero_id, estpt_id
ORDER BY (CASE WHEN festpae_id IS NULL
THEN 1 ELSE 2
END),
festpae_id DESC
) as festpae_id
并且:
WHERE data1.interest_rate AND value = 1
您还可以添加WHERE
条件并将ORDER BY
简化为ORDER BY testpae_id DESC NULLS FIRST
。