У меня есть проблема в T-SQL, которую мне трудно решить.
У меня есть таблица с группами записей, сгруппированных по ключам key1 и key2.Я заказываю каждую группу в хронологическом порядке по дате.Для каждой записи я хочу посмотреть, существовала ли запись до (внутри группы и с более низкой датой), для которой поле «поле данных» образует допустимую комбинацию с «полем данных» текущей записи.Для разрешенных комбинаций у меня есть таблица с именем AllowedCombinationTable.
Я написал следующий код для ее достижения:
WITH Source AS (
SELECT key1, key2, datafield, date1,
ROW_NUMBER() OVER(PARTITION BY key1, key2 ORDER BY date1 ASC) AS dateorder
FROM table
)
SELECT L.key1, L.key2, L.datafield, DC.datafield2
FROM Source AS L
LEFT JOIN AllowedDataCombinationsTable DC
ON D.datafield1 = L.datafield
LEFT JOIN Source AS R
ON R.Key1 = L.Key1
AND R.Key2 = L.Key2
AND R.dateorder < L.dateorder
AND DC.datafield2 = L.datafield
-- AND "pick the one record with lowest dateorder"
Теперь для каждой из этих возможных записей комбинации я хочу выбрать первуюодин (см. заполнитель в коде).Как я могу сделать это наиболее эффективно?
РЕДАКТИРОВАТЬ : ОК, скажем, для источника, только показывая группу (1, 1):
**Key1 Key2 Datafield Date DateOrder**
1 1 "Horse" 1-Jan-2010 1
1 1 "Horse" 2-Jan-2010 2
1 1 "Sheep" 3-Jan-2010 3
1 1 "Dog" 4-Jan-2010 4
1 1 "Cat" 5-Jan-2010 5
AllowedCombinationTable:
**Datafield1 Datafield**
Cat Sheep (and Sheep Cat)
Cat Horse (and Horse Cat)
Dog Horse (and Horse Dog)
После моего присоединения у меня сейчас:
**Key1 Key2 Datafield Date DateOrder JoinedCombination JoinedCombinationDateOrder**
1 1 "Horse" 1-Jan-2010 1 NULL NULL
1 1 "Horse" 2-Jan-2010 2 NULL NULL
1 1 "Sheep" 3-Jan-2010 3 NULL NULL
1 1 "Dog" 4-Jan-2010 4 "Horse" 1
1 1 "Dog" 4-Jan-2010 4 "Horse" 2
1 1 "Cat" 5-Jan-2010 5 "Horse" 1
1 1 "Cat" 5-Jan-2010 5 "Horse" 2
1 1 "Cat" 5-Jan-2010 5 "Sheep" 3
Я хочу отобразить только первую «Лошадь» для записи 4 «Собака», а также только первуюЛошадь »для записи 5« Кошка ».
Понял?;)