Ну, это не очень хороший способ сделать это, но я собрал этот код, и он работает:
SELECT distinct Reference, Value1, Value2, Value3, Value4
FROM [tblHistory]
WHERE Reference+cast(4-(case when Value1 is null then 1 else 0 end
+ case when Value2 is null then 1 else 0 end
+ case when Value3 is null then 1 else 0 end
+ case when Value4 is null then 1 else 0 END) AS varchar) IN (
SELECT myref + CAST(MAX(CountOfNonNulls) AS VARCHAR) FROM
(
SELECT myref, 4-(case when Value1 is null then 1 else 0 end
+ case when Value2 is null then 1 else 0 end
+ case when Value3 is null then 1 else 0 end
+ case when Value4 is null then 1 else 0 end)
as CountOfNonNulls
FROM [tblHistory]
)l
GROUP BY Reference
)
У меня фактически нет этой структуры таблицы, поэтому я не проверял ее, но, похоже, она работает. Идея состоит в том, чтобы создать «новый» ключ, добавив наибольшее значение CountOfNonNulls в поле Reference и используя его для ограничения выбора - это означает, что неприятный код CASE запускается дважды, но другие фильтры, которые у меня есть (не показаны), ограничивают популяцию до примерно 80 строк в моей системе, поэтому я могу жить с этим.
Я еще не видел, что бы он сделал, если бы было две строки с одинаковым значением CountOfNonNulls, но с разными полями Value1-Value4 - думаю, он сломается. В этом случае я бы, вероятно, добавил бы поля Value1-Value4 к своему «новому» ключу, но это немного глупо.
Любые предложения по улучшению будет принята с благодарностью!