3

5つの条件のほとんどが一致する結果を返すことができるクエリを実行しようとしています。ただし、5対5の一致が1つある場合は、それが優先されます。

私の質問を説明するために、次のSQLが用意されています。

declare @tmp table (
id int identity
,field1 nvarchar(60)
,field2 nvarchar(60)
,field3 nvarchar(60)
,field4 nvarchar(60)
,field5 nvarchar(60)
)

insert into @tmp values
    ('Bob','Jones','Mr','000001','bob@example.com')
insert into @tmp values
    ('Bill','Jones','','000002','bill@example.com')
insert into @tmp values
    ('Sue','Jones','Mrs','000003','jones@example.com')
insert into @tmp values
    ('Adrian','Jones','','000001','jones@example.com')
insert into @tmp values
    ('Bertha','Jones','Mrs','000001','jones@example.com')

select *
from @tmp

declare @key1 nvarchar(60), @key2 nvarchar(60), @key3 nvarchar(60), @key4 nvarchar(60), @key5 nvarchar(60)

select
    @key1 = 'Bertha'
    ,@key2 = 'Jones'
    ,@key3 = 'Mrs'
    ,@key4 = '000001'
    ,@key5 = 'jones@example.com'

select
    *
    ,case when field1 = @key1 then 1 else 0 end as X1
    ,case when field2 = @key2 then 1 else 0 end as X2
    ,case when field3 = @key3 then 1 else 0 end as X3
    ,case when field4 = @key4 then 1 else 0 end as X4
    ,case when field5 = @key5 then 1 else 0 end as X5
from @tmp

結果を見ると、3つのフィールドで3行目と4行目が一致しているのがわかりますが、5行目は5つのフィールドで一致しています。したがって、これは同一の一致であり、それが私が返したいものです。

ただし、行5が挿入されていない場合は、行3と4が最適です。その場合は、それらを返してもらいたいと思います。

私はこれを行うための最善の方法を考えようとしてきました。それが何か違いを生む可能性がある場合は、SQLServer2008を使用しています。

実際のシナリオでは、これらはすべてこの例のような単純なcaseステートメントではなく、他のテーブルへのサブ選択です。

私はgroupbyを調べて、持っていますが、このシナリオでそれらをどのように使用できるかわかりませんでした。

SQL Serverでこのような複数の条件にわたって「ベストオブ」タイプの一致を行うにはどうすればよいですか?

ページが私に言っているようにこれが「主観的」に見える場合は、そう言ってください、そして私はそれを削除します。しかし、これは主観的なものではないと思います。これは、SQLの重複排除シナリオであり、一般的に要求されていると思います。

4

1 に答える 1

2

xスコアを取得するには、列をSUMにロールすることを検討してください。クエリできるCTE(共通テーブル式)は次のとおりです。

;with mysum AS (
select    *
    ,case when field1 = @key1 then 1 else 0 end as X1
    ,case when field2 = @key2 then 1 else 0 end as X2
    ,case when field3 = @key3 then 1 else 0 end as X3
    ,case when field4 = @key4 then 1 else 0 end as X4
    ,case when field5 = @key5 then 1 else 0 end as X5
from @tmp)

SELECT id, field1, field2, field3, field4, field5, 
       SUM(x5+x4+x3+x2+x1) AS MatchScore 
FROM MySum
GROUP BY id, field1, field2, field3, field4, field5
ORDER BY MatchScore DESC
于 2012-05-09T16:00:53.567 に答える