在Oracle SQL中排除/忽略周末

在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

我做了一个查询,将文本及其开始和结束日期分组在一起,我想排除/忽略周末

在这个例子中,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-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你根本不需要编辑任何东西。看到输出中有周末吗?周末不在我的数据库中,如果没有这些日期,您的查询将无法工作