Select między zakresem dat z haczykiem

0

Hej,

Mam mały problem z zapytaniem. Pod linkiem przykładowy zestaw danych
http://sqlfiddle.com/#!18/fb8699/1

Baza to MSSQL 2017.

Co potrzebuję zrobić:
Wyciągnąć dane elementy z określonego zakresu. To rozwiązałem wykorzystując dwie zmienne @DATAOD oraz @DATADO. Tutaj problemu nie ma.

Problem pojawia się w momencie próby wyciągnięcia danych spełniających kolejne warunki:

  • Wybrać model z zdefiniowanego zakresu, który nie został dodany już wcześniej (jeden model może być dodany kilkukrotnie) - niestety inaczej nie można tego zrobić, w systemie model jest atrybutem i jedynie daty wpisane w momencie wykorzystania go w artykule.
  • I jeśli model był dodany w zdefiniowanym zakresie kilkukrotnie to ma wybrać tylko pierwszą datę wystąpienia.
1

Nie mogę się wbic na SQLFiddle, ale to będzie coś w ten desen:

SELECT mode, min(data_dodania) data_dodania FROM modele WHERE data_dodania BETWEEN @DATA_OD and @DATA_DO AND not Exists(SELECT model FROM modele WHERE data_dodania<@DATA_OD) GROUP BY 1 
1

może tak http://sqlfiddle.com/#!18/fb8699/13

SELECT
  model,
  nazwa,
  min(data_dodania) data_dodania
FROM
  ForgeRock
group by
  model,
  nazwa

wydaje mi się (bo nie do końca rozumiem założenia bo 1 i 2 się wykluczają wzajemnie) że o to Ci chodzi

1

Jeżeli nazwa dla modelu może się zmieniać w czasie to group by odpada, można wykorzystać nowości z SQL 2017 i zrobić tak:

with md as (
	SELECT
		model,
		nazwa,
		data_dodania,
		min(data_dodania) over (partition by model order by data_dodania) mindt
	FROM
		ForgeRock)
, dt as (
	select 
		*,
		row_number() over (partition by model order by data_dodania) r
	from
		md
	where
		data_dodania between '2018-01-05' and '2018-12-31'
		and mindt >= '2018-01-05')

select 
	model
	,nazwa
	,data_dodania 
from 
	dt 
where 
	r=1;

lub w opozycji do rozwiązania @Marcin.Miga, by uniknąć negacji w warunku where:

select 
	fr.model
	,fr.nazwa
	,min(fr.data_dodania) data_dodania 
from 
	ForgeRock fr
	left join (select 
					model 
				from 
					ForgeRock 
				where 
					data_dodania<'2018-01-05' 
				group by 
					model) md on md.model=fr.model
where 
	md.model is null
group by 
	fr.model
	,fr.nazwa

http://sqlfiddle.com/#!18/fb8699/30

0

Dzięki wszystkim za pomoc.
O ile rozwiązania zaproponowane przez @Marcin.Miga oraz @abrakadaber sprawdzały się ok, ale tylko przy dacie rozpoczęcia 2018.01.01. Gdy wybierałem już datę rozpoczęcia powiedzmy lutową i późniejszą to wyniki był puste.
Rozwiązanie zaproponowane przez @Panczo elegancko wpasowało się w wymagania ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1