在Oracle SQL中排除/忽略周末
我做了一个查询,将文本及其开始和结束日期分组在一起,我想排除/忽略周末 在这个例子中,4月11-12日和18-19日是周末在Oracle SQL中排除/忽略周末,sql,oracle,Sql,Oracle,我做了一个查询,将文本及其开始和结束日期分组在一起,我想排除/忽略周末 在这个例子中,4月11-12日和18-19日是周末 create table t ( d date, v varchar2(10)); insert into t values (date '2015-04-10', 'ne'); insert into t values (date '2015-04-13', 'ne'); insert into t values (date '2015-04-1
create table t ( d date, v varchar2(10));
insert into t values (date '2015-04-10', 'ne');
insert into t values (date '2015-04-13', 'ne');
insert into t values (date '2015-04-14', 'jm');
insert into t values (date '2015-04-15', 'ne');
insert into t values (date '2015-04-16', 'jm');
insert into t values (date '2015-04-17', 'jm');
insert into t values (date '2015-04-20', 'jm');
insert into t values (date '2015-04-21', 'jm');
以及查询
select min(d), max(d), v
from (
select d, v,
sum( gc) over (partition by v order by d) g
from (
select d, v,
(case (d - lag(d) over ( partition by v order by d) )
when 1 then 0
else 1
end) gc
from t
)
) group by v, g
order by min(d), v
我做了一把小提琴
输出
MIN(D) max(D) v
2015-04-10 - 2015-04-13 - ne
2015-04-14 - 2015-04-14 - jm
2015-04-15 - 2015-04-15 - ne
2015-04-16 - 2015-04-21 - jm
您可以添加如下过滤器:
WHERE TO_CHAR(d, 'DY','NLS_DATE_LANGUAGE=AMERICAN') NOT IN ('SAT', 'SUN')
比如说,
设置
CREATE TABLE t ( d DATE, v VARCHAR2(10));
INSERT INTO t VALUES (DATE '2015-04-10', 'ne');
INSERT INTO t VALUES (DATE '2015-04-11', 'ne'); --> Added new row for demo
insert into t values (date '2015-04-12', 'ne'); --> Added new row for demo
INSERT INTO t VALUES (DATE '2015-04-13', 'ne');
INSERT INTO t VALUES (DATE '2015-04-14', 'jm');
INSERT INTO t VALUES (DATE '2015-04-15', 'ne');
INSERT INTO t VALUES (DATE '2015-04-16', 'jm');
INSERT INTO t VALUES (DATE '2015-04-17', 'jm');
INSERT INTO t VALUES (DATE '2015-04-18', 'jm'); --> Added new row for demo
INSERT INTO t VALUES (DATE '2015-04-19', 'jm'); --> Added new row for demo
INSERT INTO t VALUES (DATE '2015-04-20', 'jm');
INSERT INTO t VALUES (DATE '2015-04-21', 'jm');
SQL> SELECT * FROM t;
D V
--------- ----------
10-APR-15 ne
11-APR-15 ne
12-APR-15 ne
13-APR-15 ne
14-APR-15 jm
15-APR-15 ne
16-APR-15 jm
17-APR-15 jm
18-APR-15 jm
19-APR-15 jm
20-APR-15 jm
D V
--------- ----------
21-APR-15 jm
12 rows selected.
测试用例
SQL> SELECT *
2 FROM t
3 WHERE TO_CHAR(d, 'DY','NLS_DATE_LANGUAGE=AMERICAN') NOT IN ('SAT', 'SUN');
D V
--------- ----------
10-APR-15 ne
13-APR-15 ne
14-APR-15 jm
15-APR-15 ne
16-APR-15 jm
17-APR-15 jm
20-APR-15 jm
21-APR-15 jm
8 rows selected.
因此,在查询中使用上述逻辑可以获得所需的输出
修改的查询
SQL> SELECT MIN(d),
2 MAX(d),
3 v
4 FROM
5 (SELECT d,
6 v,
7 SUM( gc) over (partition BY v order by d) g
8 FROM
9 (SELECT d,
10 v,
11 (
12 CASE (d - lag(d) over ( partition BY v order by d) )
13 WHEN 1
14 THEN 0
15 ELSE 1
16 END) gc
17 FROM t
18 )
19 )
20 WHERE TO_CHAR(d, 'DY','NLS_DATE_LANGUAGE=AMERICAN') NOT IN ('SAT', 'SUN')
21 GROUP BY v,
22 g
23 ORDER BY MIN(d),
24 v;
MIN(D) MAX(D) V
--------- --------- ----------
10-APR-15 13-APR-15 ne
14-APR-15 14-APR-15 jm
15-APR-15 15-APR-15 ne
16-APR-15 21-APR-15 jm
SQL>
您的查询在
案例中进行了少量修改。。。当
不包括周末时:
select min(d), max(d), v
from (
select d, v, sum( gc) over (partition by v order by d) g
from (
select d, v,
case when d-lag(d) over (partition by v order by d)
= decode(trunc(d, 'iw') - d, 0, 3, 1)
then 0
else 1
end gc
from t))
group by v, g
order by min(d), v
递归解决方案也是可能的,但我怀疑这会更快。SQL FIDLE很棒。但是,我们应该能够理解您的问题,而不必留下堆栈溢出。请使用示例数据和所需结果编辑您的问题。另外,请解释你所说的周末和假日是什么意思。谢谢,它现在在我的帖子中,你想要样本数据的输出是什么?谢谢你的代码,在我的SQLFiddle中它仍然不会忽略周末:@MeesvanZ如果你指的是周六和周日,那么首先,你的设置中没有它们。因此,您的输出只显示工作日(这是正确的)。在我的回答中,我明确地添加了缺少的行,然后导出了所需的输出。我没有编辑数据库的权限,只能查询“读取”functions@MeesvanZ你根本不需要编辑任何东西。看到输出中有周末吗?周末不在我的数据库中,如果没有这些日期,您的查询将无法工作