Например, как здесь:
with
t1 as (select add_months(trunc(sysdate, 'month'), -1) dt from dual),
t2 as (
select dt + level - 1 dt, to_char(dt + level - 1, 'dy', 'nls_date_language=english') dy
from t1 connect by dt + level - 1 < trunc(sysdate, 'month'))
select to_char(dt, 'yyyymmdd') dt, dy
from (
select dt, dy, sum(case when dy = 'sat' then 1 end) over (order by dt) sm from t2)
where dy = 'sun' or (dy = 'sat' and sm in (2, 4))
Результат:
DT DY
-------- ---
20190203 sun
20190209 sat
20190210 sun
20190217 sun
20190223 sat
20190224 sun
Я сгенерировал все дни за предыдущий месяц, присвоил английские названия дней, условно подсчитал субботы и показал только интересные даты.
Редактировать:
Это работает, но есть ли способ обойти предложение with, так как мой родительский запрос имеет тип from: with xкак (.... где дата в ("требуемые дни") и ...).Таким образом, он представляет собой вложенную ситуацию.
Да, вы можете легко преобразовать ее, например, как здесь:
select to_char(dt, 'yyyymmdd') dt
from (
select dt, dn, rank() over (order by mod(dn, 6), dt) rnk
from (
select d + level - 1 dt, d + level - trunc(d + level - 1, 'iw') dn
from (select add_months(trunc(sysdate, 'month'), -1) d from dual)
connect by level <= add_months(d, 1) - d))
where dn = 7 or (dn = 6 and rnk in (2, 4))
dbfiddle demo
with
пункт сделал шаги более читабельными.Теперь я также использовал номера дней и mod()
для подсчета, просто чтобы показать разные подходы, но вы можете использовать все, что вам понятнее (названия дней, sum
или count
вместо rank
).