我的查询:
WITH PH AS(
SELECT CHR,CHNO,CHSQ,CHVR,CHSB
,ROW_NUMBER () OVER(PARTITION BY CHNO ORDER BY CHSQ,CHVR DESC ) TEMP
FROM WRPD.WSCL
WHERE CHAD > '20180901'
AND CHSB ='P'
AND CHB1 in ('L1', 'R2')
),
DT AS(SELECT CHR,CHNO,CHSQ,CHVR,CHSB
,ROW_NUMBER () OVER(PARTITION BY CHNO ORDER BY CHSQ,CHVR DESC ) TEMP
FROM WRPD.WSCL
WHERE CHAD > '20180901'
AND CHSB IN ('R','A','Q')
AND CHB1 in ('L1', 'R2')
)
SELECT *
FROM PH A
WHERE A.TEMP=1
UNION
SELECT *
FROM DT B
WHERE B.TEMP=1
样本数据:
在前8行中,除CHVR,CHSB和Temp
CHR CHNO CHSQ CHVR CHSB TEMP
A F41 841 1 P 1
A F41 841 0 R 2
B 447 147 1 P 1
B 447 147 0 R 2
C 742 742 1 P 1
C 742 742 0 R 2
D 231 135 3 P 1
D 231 135 2 R 2
E 749 417 0 A 1
E 775 153 0 P 1
E 775 153 0 A 1
E 178 833 1 Q 1
E 184 418 0 A 1
E 192 419 0 P 1
E 193 419 0 P 1
E 194 444 0 P 1
E 198 263 0 A 1
E 204 450 0 A 1
E 203 120 0 A 1
所需结果:
我需要CHSB ='P'的结果,这意味着: 基本上,如果CHR = CHR和CHNO = CHNO和CHSQ = CHSQ,则在CHSB ='P'时显示值,'P'的CHVR也会大于'R'的CHVR。
CHR CHNO CHSQ CHVR CHSB TEMP
A F41 841 1 P 1
B 447 147 1 P 1
C 742 742 1 P 1
D 231 135 3 P 1
E 749 417 0 A 1
E 775 153 0 P 1
E 775 153 0 A 1
E 178 833 1 Q 1
E 184 418 0 A 1
E 192 419 0 P 1
E 193 419 0 P 1
E 194 444 0 P 1
E 198 263 0 A 1
E 204 450 0 A 1
E 203 120 0 A 1
我不确定如何以及在何处将条件包括在查询中。 预先感谢
编辑:通过此语句also CHVR of 'P' will be greater than CHVR of 'R'
:我的意思是:
例如,当我们查看示例数据时,以下两行是彼此重复的:
CHR CHNO CHSQ CHVR CHSB TEMP
A F41 841 1 P 1
A F41 841 0 R 2
现在我希望消除CHSB ='P'的行。 但是此重复项中有三列不同:
CHVR=Version
,CHSB=Status
,TEMP=Temporary Value
现在,
以下条件将始终为真:
在重复的行中
当Status='P' Version='1'
和Status='R' Version='0'
这意味着value of version (1) for status='P'
大于value of version(0) for status='R'.
答案 0 :(得分:0)
select chr, chrno, chsq, chvr, chsb, temp
from mytable
where chsb = 'P' or (chr, chrno, chsq) not in
(select chr, chrno, chsq from mytable where chsb = 'P')
可以在您希望在其中看到的所有记录添加完毕后在输出表上运行它。假定所有重复对象都恰好由一个chsb ='P'和一个chsb = SomethingElse组成。如果可能有三个记录重复项集,或者可能是涉及chsb而不是“ P”的重复项,则需要建立一个层次结构来确定要返回的记录。您可能必须命名表并使用它们限定字段名称,以消除歧义。另外,当在select语句中指定temp = 1时,为什么结果中会得到temp = 2?
答案 1 :(得分:0)
这是一个技巧问题吗?要从输入数据中获得所需的结果,您只需说WHERE CHSB <> 'R'
WITH T(CHR,CHNO,CHSQ,CHVR,CHSB,TEMP) AS
(VALUES
('A','F41',841,1,'P',1)
,('A','F41',841,0,'R',2)
,('B','447',147,1,'P',1)
,('B','447',147,0,'R',2)
,('C','742',742,1,'P',1)
,('C','742',742,0,'R',2)
,('D','231',135,3,'P',1)
,('D','231',135,2,'R',2)
,('E','749',417,0,'A',1)
,('E','775',153,0,'P',1)
,('E','775',153,0,'A',1)
,('E','178',833,1,'Q',1)
,('E','184',418,0,'A',1)
,('E','192',419,0,'P',1)
,('E','193',419,0,'P',1)
,('E','194',444,0,'P',1)
,('E','198',263,0,'A',1)
,('E','204',450,0,'A',1)
,('E','203',120,0,'A',1)
)
SELECT CHR,CHNO,CHSQ,CHVR,CHSB,TEMP FROM T
WHERE CHSB <> 'R'
CHR CHNO CHSQ CHVR CHSB TEMP
--- ---- ---- ---- ---- ----
A F41 841 1 P 1
B 447 147 1 P 1
C 742 742 1 P 1
D 231 135 3 P 1
E 749 417 0 A 1
E 775 153 0 P 1
E 775 153 0 A 1
E 178 833 1 Q 1
E 184 418 0 A 1
E 192 419 0 P 1
E 193 419 0 P 1
E 194 444 0 P 1
E 198 263 0 A 1
E 204 450 0 A 1
E 203 120 0 A 1
如果这不是您想要的。我建议您删除此问题,并尝试以一种更清晰,最小化和可理解的方式询问它。
答案 2 :(得分:0)
with a (CHR, CHNO, CHSQ, CHVR, CHSB, TEMP) as (values
('A', 'F41', 841, 1, 'P', 1)
, ('A', 'F41', 841, 0, 'R', 2)
, ('B', '447', 147, 1, 'P', 1)
, ('B', '447', 147, 0, 'R', 2)
-- ...
, ('E', '203', 120, 0, 'A', 1)
)
select CHR, CHNO, CHSQ, CHVR, CHSB, TEMP
from (
select a.*, rownumber() over (partition by CHR, CHNO, CHSQ order by case CHSB when 'P' then 0 else 1 end) rn_
from a
)
where rn_=1;
答案 3 :(得分:0)
通过此查询,我得到了所需的结果:
Watched a video that has been removed