SQL查询应不使用初始值进行计数,只对有效的更改进行计数
根据表格:SQL查询应不使用初始值进行计数,只对有效的更改进行计数,sql,oracle,Sql,Oracle,根据表格: CREATE TABLE blah (CAT, BUSINESS_NR, TIME_A, VERSION, SOME_CODE) AS SELECT 'ABC', 123, TIMESTAMP '2009-02-19 00:00:00 UTC', 1, 'OPP' FROM DUAL UNION ALL SELECT 'ABC', 456, TIMESTAMP '2009-03-18 00:00:00 UTC', 1, 'ZUM' FROM DUA
CREATE TABLE blah (CAT, BUSINESS_NR, TIME_A, VERSION, SOME_CODE) AS
SELECT 'ABC', 123, TIMESTAMP '2009-02-19 00:00:00 UTC', 1, 'OPP' FROM DUAL UNION ALL
SELECT 'ABC', 456, TIMESTAMP '2009-03-18 00:00:00 UTC', 1, 'ZUM' FROM DUAL UNION ALL
SELECT 'ABC', 444, TIMESTAMP '2009-03-18 00:00:00 UTC', 1, 'ZUM' FROM DUAL UNION ALL
SELECT 'ABC', 444, TIMESTAMP '2009-03-18 00:00:00 UTC', 2, 'MUZ' FROM DUAL UNION ALL
SELECT 'ABC', 456, TIMESTAMP '2009-04-18 00:00:00 UTC', 2, 'XXX' FROM DUAL UNION ALL
SELECT 'ABC', 456, TIMESTAMP '2009-04-18 00:00:00 UTC', 3, 'XXX' FROM DUAL UNION ALL
SELECT 'ABC', 456, TIMESTAMP '2009-04-18 00:00:00 UTC', 4, 'UIO' FROM DUAL UNION ALL
SELECT 'ABC', 456, TIMESTAMP '2009-05-18 00:00:00 UTC', 5, 'RQA' FROM DUAL UNION ALL
SELECT 'DEF', 637, TIMESTAMP '2018-02-16 00:00:00 UTC', 1, 'FAW' FROM DUAL UNION ALL
SELECT 'DEF', 789, TIMESTAMP '2018-02-17 00:00:00 UTC', 1, 'WER' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-16 00:00:00 UTC', 1, 'AAA' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-17 00:00:00 UTC', 2, 'BBB' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-18 00:00:00 UTC', 3, 'AAA' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-19 00:00:00 UTC', 4, 'CCC' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-20 00:00:00 UTC', 5, 'AAA' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-21 00:00:00 UTC', 6, 'DDD' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-22 00:00:00 UTC', 7, 'DDD' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-23 00:00:00 UTC', 8, 'DDD' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-24 00:00:00 UTC', 9, 'EEE' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-25 00:00:00 UTC', 10, 'EEE' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-26 00:00:00 UTC', 11, 'DDD' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-27 00:00:00 UTC', 12, 'BBB' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-26 00:00:00 UTC', 13, 'EEE' FROM DUAL UNION ALL
SELECT 'SPZ', 123, TIMESTAMP '2018-02-27 00:00:00 UTC', 14, 'EEE' FROM DUAL UNION ALL
SELECT 'FLA', 123, TIMESTAMP '2018-02-16 00:00:00 UTC', 1, 'ABC' FROM DUAL UNION ALL
SELECT 'FLA', 123, TIMESTAMP '2018-03-17 00:00:00 UTC', 2, 'ABC' FROM DUAL UNION ALL
SELECT 'FLA', 123, TIMESTAMP '2018-04-18 00:00:00 UTC', 3, 'ABC' FROM DUAL UNION ALL
SELECT 'FLA', 123, TIMESTAMP '2018-05-18 00:00:00 UTC', 4, 'AAA' FROM DUAL UNION ALL
SELECT 'GHI', 248, TIMESTAMP '2018-02-17 00:00:00 UTC', 1, 'QWE' FROM DUAL UNION ALL
SELECT 'GHI', 248, TIMESTAMP '2019-02-17 00:00:00 UTC', 2, 'PPP' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-02-16 00:00:00 UTC', 1, 'FFF' FROM DUAL UNION ALL
SELECT 'GHI', 420, TIMESTAMP '2020-02-16 00:00:00 UTC', 1, 'QDS' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-02-16 00:00:00 UTC', 2, 'GGG' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-02-16 00:00:00 UTC', 3, 'LLL' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-02-16 00:00:00 UTC', 4, 'LLL' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-08-16 00:00:00 UTC', 4, 'FFF' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-10-16 00:00:00 UTC', 5, 'ZZZ' FROM DUAL
我需要一个查询,通过CAT和MONTH向我提供一个粗略的概述,在以下情况下,某个业务的某些代码发生了多少更改:
对于某些代码,第一个版本1和所有相同的版本都不能计算在内
所有相等且相互跟随的_代码值应计为一
根据stackoverflow中SQL专家的所有超酷输入提示,我现在提出了以下方法:
SELECT cat, moenat, SUM (version_change) AS total_version_changes
FROM (SELECT cat,
TRUNC (TIME_A, 'MON') AS moenat,
CASE
WHEN some_code <>
LAG (some_code) OVER (PARTITION BY cat ORDER BY version, time_a)
OR LAG (some_code) OVER (PARTITION BY cat ORDER BY version, time_a) IS NULL --Needed for version 1
THEN
1
ELSE
0
END AS version_change
FROM blah where version >1)
GROUP BY cat, moenat
ORDER BY cat, moenat;
这实际上不是我想要的,因为版本1-3是初始值。2018年5月版本4中只有1处变更
FLA', 123, TIMESTAMP '2018-02-16 00:00:00 UTC', 1, 'ABC'
FLA', 123, TIMESTAMP '2018-03-17 00:00:00 UTC', 2, 'ABC'
FLA', 123, TIMESTAMP '2018-04-18 00:00:00 UTC', 3, 'ABC'
FLA', 123, TIMESTAMP '2018-05-18 00:00:00 UTC', 4, 'AAA'
因此,此处的预期输出应为:
FLA 01.05.2018 1
有人能帮我解决这个问题吗
第二实验台:
CREATE TABLE blah (CAT, BUSINESS_NR, TIME_A, VERSION, SOME_CODE) AS
SELECT 'FLA', 123, TIMESTAMP '2018-02-16 00:00:00 UTC', 1, 'ABC' FROM DUAL UNION ALL --0, because initial
SELECT 'FLA', 123, TIMESTAMP '2018-03-17 00:00:00 UTC', 2, 'ABC' FROM DUAL UNION ALL --0, because still like initial
SELECT 'FLA', 123, TIMESTAMP '2018-04-18 00:00:00 UTC', 3, 'ABC' FROM DUAL UNION ALL --0, because still like initial
SELECT 'FLA', 123, TIMESTAMP '2018-05-18 00:00:00 UTC', 4, 'AAA' FROM DUAL UNION ALL --1, valid change, count for MAY 2018
SELECT 'FLA', 555, TIMESTAMP '2018-05-18 00:00:00 UTC', 1, 'AAA' FROM DUAL UNION ALL --0, because initial
SELECT 'FLA', 777, TIMESTAMP '2018-05-18 00:00:00 UTC', 1, 'ZZZ' FROM DUAL UNION ALL --0, because initial
SELECT 'FLA', 777, TIMESTAMP '2018-05-18 00:00:00 UTC', 2, 'ZZZ' FROM DUAL UNION ALL --0, because still like initial
SELECT 'FLA', 777, TIMESTAMP '2018-05-18 00:00:00 UTC', 3, 'ZZZ' FROM DUAL UNION ALL --0, because still like initial
SELECT 'FLA', 777, TIMESTAMP '2018-06-18 00:00:00 UTC', 4, 'ZZZ' FROM DUAL UNION ALL --0, because still like initial
SELECT 'FLA', 777, TIMESTAMP '2018-07-18 00:00:00 UTC', 5, 'ZZZ' FROM DUAL UNION ALL --0, because still like initial
SELECT 'FLA', 888, TIMESTAMP '2018-05-18 00:00:00 UTC', 1, 'ZZZ' FROM DUAL UNION ALL --0, because initial
SELECT 'FLA', 888, TIMESTAMP '2018-05-18 00:00:00 UTC', 2, 'ZZZ' FROM DUAL UNION ALL --0, because still like initial
SELECT 'FLA', 888, TIMESTAMP '2018-05-18 00:00:00 UTC', 3, 'ABC' FROM DUAL UNION ALL --1, valid change, count for MAY 2018
SELECT 'FLA', 888, TIMESTAMP '2018-05-18 00:00:00 UTC', 4, 'DEF' FROM DUAL UNION ALL --1, valid change, count for MAY 2018
SELECT 'FLA', 888, TIMESTAMP '2018-06-18 00:00:00 UTC', 5, 'GHI' FROM DUAL UNION ALL --1, valid change, count in JUNE 2018
SELECT 'FLA', 999, TIMESTAMP '2018-05-18 00:00:00 UTC', 1, 'GHI' FROM DUAL UNION ALL --0, because initial
SELECT 'FLA', 999, TIMESTAMP '2018-06-18 00:00:00 UTC', 2, 'GHI' FROM DUAL UNION ALL --0, because still like initial
SELECT 'FLA', 999, TIMESTAMP '2018-09-18 00:00:00 UTC', 3, 'ZIP' FROM DUAL DUAL; --1, valid change, count for SEP 2018
输出应为:
FLA MAY 2018: 3
FLA JUN 2018: 1
FLA SEP 2018: 3
OR条件中的第二个子句是导致计算第一个更改的原因。另外,将business_nr添加到partition子句中,可以更正针对第二个表进行测试时的计数
选择cat、moenat、SUM版本变更作为总版本变更
从选择猫,
真是时间啊,我是莫纳特,
案例
当某些代码
延迟某个代码
按类别、业务顺序、版本、时间划分
然后
1.
其他的
0
随着版本的更改而结束
胡说八道
按猫分组,moenat
-可以对下面的子句进行注释/取消注释,以隐藏未发生更改的行
-总和版本更改>0
猫叫,莫纳特;
解决了我的问题,谢谢
FLA MAY 2018: 3
FLA JUN 2018: 1
FLA SEP 2018: 3