sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2005 で最も近いものを選択するにはどうすればよいですか?

    SQL Server 2005 以降の場合:

    ;WITH SalesScore AS (
    SELECT
        s.PK_ID as S_PK
            ,c.PK_ID AS c_PK
            ,CASE 
                 WHEN c.PK_ID IS NULL THEN 0
                 ELSE CASE WHEN s.ServiceId=c.ServiceId THEN 1 ELSE 0 END
                      +CASE WHEN (s.Address=c.Address AND s.Zip=c.Zip) THEN 1 ELSE 0 END
                      +CASE WHEN s.EmailAddress=c.EmailAddress THEN 1 ELSE 0 END
                      +CASE WHEN s.HomePhone=c.HomePhone THEN 1 ELSE 0 END
             END AS Score
        FROM Sales s
            LEFT OUTER JOIN Customers c ON s.ServiceId=c.ServiceId
                                           OR (s.Address=c.Address AND s.Zip=c.Zip)
                                           OR s.EmailAddress=c.EmailAddress
                                           OR s.HomePhone=c.HomePhone 
    )
    SELECT 
        s.*,c.*
        FROM (SELECT
                  S_PK,MAX(Score) AS Score
                  FROM SalesScore 
                  GROUP BY S_PK
             ) dt
            INNER JOIN Sales          s ON dt.s_PK=s.PK_ID 
            INNER JOIN SalesScore    ss ON dt.s_PK=s.PK_ID AND dt.Score=ss.Score
            LEFT OUTER JOIN Customers c ON ss.c_PK=c.PK_ID
    

    編集 スキーマが指定されていない場合、実際にこれを実行して動作を確認することができないため、多くの実際のコードを書くのは嫌いです。ただし、最終取引日を使用して引き分けを処理する方法の質問に答えるために、上記のコードの新しいバージョンを次に示します。

    ;WITH SalesScore AS (
    SELECT
        s.PK_ID as S_PK
            ,c.PK_ID AS c_PK
            ,CASE 
                 WHEN c.PK_ID IS NULL THEN 0
                 ELSE CASE WHEN s.ServiceId=c.ServiceId THEN 1 ELSE 0 END
                      +CASE WHEN (s.Address=c.Address AND s.Zip=c.Zip) THEN 1 ELSE 0 END
                      +CASE WHEN s.EmailAddress=c.EmailAddress THEN 1 ELSE 0 END
                      +CASE WHEN s.HomePhone=c.HomePhone THEN 1 ELSE 0 END
             END AS Score
        FROM Sales s
            LEFT OUTER JOIN Customers c ON s.ServiceId=c.ServiceId
                                           OR (s.Address=c.Address AND s.Zip=c.Zip)
                                           OR s.EmailAddress=c.EmailAddress
                                           OR s.HomePhone=c.HomePhone 
    )
    SELECT
        *
        FROM (SELECT 
                  s.*,c.*,row_number() over(partition by s.PK_ID order by s.PK_ID ASC,c.LastTransaction DESC) AS RankValue
                  FROM (SELECT
                            S_PK,MAX(Score) AS Score
                            FROM SalesScore 
                            GROUP BY S_PK
                       ) dt
                      INNER JOIN Sales          s ON dt.s_PK=s.PK_ID 
                      INNER JOIN SalesScore    ss ON dt.s_PK=s.PK_ID AND dt.Score=ss.Score
                      LEFT OUTER JOIN Customers c ON ss.c_PK=c.PK_ID
             ) dt2
        WHERE dt2.RankValue=1
    


    1. 「ヘルプ」主キー列をサーバーで生成できません

    2. ユーザー'root'@'localhost'のアクセスが拒否されました(パスワード:NOを使用)?php / MySQLを認証できませんか?

    3. 複数のMySQLテーブルから値をマージしたRデータフレームを取得します

    4. リッチテキストボックスのデータをフォーマットしてデータベースに保存する