sql - 在某些行上重复一个值
问题描述
我有一个值列表,我必须按CHILDVALUE
以下方式显示母值。MOTHERVALUE
应该与 at 相同,CHILDVALUE
否则RNO = 1
对MOTHERVALUE
后续行重复 ,直到遇到从 RNO = 1 开始的新序列。以下是我希望实现的
RNO ChildValue MotherValue SKIPNO CREATEDDATE
1 345dg 345dg 4 19/9/2018 2:49
2 342sds 345dg 4 19/9/2018 11:53
.
.
.
19 343dfd 345dg 4 6/11/2018 12:40
20 234dfs 345dg 4 6/11/2018 14:56
1 545ert 545ert 4 6/11/2018 15:17
2 543tye 545ert 4 7/11/2018 11:29
.
.
.
9 345cxv 545ert 4 16/11/2018 14:16
1 563mnj 563mnj 5 19/11/2018 2:12
行号是根据SKIPNO
(not distinct) 和动态生成的CREATEDDATE
。但是我在显示MOTHERVALUE
某些行的正确性时遇到了问题
我尝试了以下查询,它最能满足至少 50% 的需求。
select RNO
, CHILDVALUE
, case RNO when 1 then CHILDVALUE
else lag(MOTHERVALUE) over (order by SKIPNO, CreatedDate ASC) end as MOTHERVALUE
, SKIPNO, CreatedDate
from( SELECT (ROW_NUMBER() OVER (PARTITION BY A.SKIPNO
ORDER BY A.SKIPNO, A.CreatedDate ASC) RNO
, A.*
from (select distinct CHILDVALUE
, CHILDVALUE as MOTHERVALUE
, SKIPNO
, CreatedDate
from values ) A
)
)
此查询部分给出了预期的输出,但仍与实际结果相去甚远,因为它显示了MOTHERVALUE only for the first two rows. The query does not help me to show the correct
超过第二行的正确 MOTHERVALUE`。
这是我的桌子:
CREATE TABLE VALUES (
CHILDVALUE VARCHAR2(36),
SKIPNO VARCHAR2(36),
CREATEDDATE DATE)
请帮忙。
解决方案
注意我假设您的样本数据在第二组和第三组中的skipnos 不正确。我的答案在其样本数据中使用了更新的值。
您可以使用first_value
分析功能,而不是lag
实现您的目标,例如:
WITH vals AS (SELECT '345dg' childvalue, 4 skipno, to_date('19/09/2018 02:49', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
SELECT '342sds' childvalue, 4 skipno, to_date('19/09/2018 11:53', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
SELECT '343dfd' childvalue, 4 skipno, to_date('06/11/2018 12:40', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
SELECT '234dfs' childvalue, 4 skipno, to_date('06/11/2018 14:56', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
SELECT '545ert' childvalue, 5 skipno, to_date('06/11/2018 15:17', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
SELECT '543tye' childvalue, 5 skipno, to_date('07/11/2018 11:29', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
SELECT '345cxv' childvalue, 5 skipno, to_date('16/11/2018 14:16', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
SELECT '563mnj' childvalue, 6 skipno, to_date('19/11/2018 02:12', 'dd/mm/yyyy hh24:mi') createddate FROM dual)
SELECT row_number() OVER (PARTITION BY skipno ORDER BY createddate) rno,
childvalue,
first_value(childvalue) OVER (PARTITION BY skipno ORDER BY createddate) mothervlue,
skipno,
createddate
FROM vals;
RNO CHILDVALUE MOTHERVLUE SKIPNO CREATEDDATE
---------- ---------- ---------- ---------- -----------
1 345dg 345dg 4 19/09/2018
2 342sds 345dg 4 19/09/2018
3 343dfd 345dg 4 06/11/2018
4 234dfs 345dg 4 06/11/2018
1 545ert 545ert 5 06/11/2018
2 543tye 545ert 5 07/11/2018
3 345cxv 545ert 5 16/11/2018
1 563mnj 563mnj 6 19/11/2018
推荐阅读
- java - 如何在 Apache Poi 中反转轴
- mysql - 从 MYSQL 中的动态 SQL 获取特定字段值
- python - 如何更改 Plotly Wind 玫瑰极轴?
- docker - 如何在智能云上部署 docker react 应用程序
- ios - 当“App Identifier”更新其 APNS 证书时,是否需要重新生成 Apple“Provisioning Profiles”?
- angular - 我的 Angular 9 应用程序滚动事件有一个问题,它确实会触发,但我正在更新的类名不会更新 dom
- .net - 以编程方式在 System.Web.MimeMapping 中添加自定义 MIME 类型
- angular - 角材料选择不打开选项
- python-3.x - 具有奇怪值范围的 matplotlib.pyplot 热图
- c# - C# FirebirdClient:无法执行 INSERT 语句