0

したがって、別のテーブルに結合できる中央値のテーブルを返すストアド SQL サーバー関数を作成しようとしています。

CREATE FUNCTION [dbo].getmedian (@varPartionBy1 int,@varPartionBy2 int, @varForTieBreak int, @varForMeasure int)
    RETURNS TABLE
    AS
    RETURN 
    (
        SELECT
           @varPartionBy1,
           @varPartionBy2,
           AVG(@varForMeasure) 
        FROM
        (
           SELECT
              @varPartionBy1,
              @varPartionBy2,
              ROW_NUMBER() OVER (
                 PARTITION BY @varPartionBy1, @varPartionBy2
                 ORDER BY @varForMeasure ASC, @varForTieBreak ASC) AS RowAsc,
              ROW_NUMBER() OVER (
                 PARTITION BY @varPartionBy1, @varPartionBy2 
                 ORDER BY @varForMeasure ASC, @varForTieBreak  DESC) AS RowDesc
            from 
            [fakename].[dbo].[temptable] bp

        ) bp
        WHERE 
           RowAsc IN (RowDesc, RowDesc - 1, RowDesc + 1)
        GROUP BY @varPartionBy1, @varPartionBy2

    )

行く

「メッセージ 8155、レベル 16、状態 2、プロシージャ getmedian、行 25 'bp' の列 1 に列名が指定されていません」というエラーが返されます。-- UDF のコンテキストで列にテーブル エイリアスを割り当てる方法がわからないことを示していると思います。

エラーを修正するにはどうすればよいですか?

これは私の最初の USF ですので、主要な質問に対処する際に、他に役立つ設計の洞察をいただければ幸いです。助けてくれてありがとう!

4

2 に答える 2

1

構文の問題を片付けたら、問題は解決しません。1 つには、やろうとしていることが実際にはできません ( PARTITION BYandORDER BY節に変数を渡します)。それらは定数として扱われるだけなので、ROW_NUMBER()は任意に適用されます。

ここで何が起こるかを観察してください:

DECLARE @foo SYSNAME = N'name';

SELECT name, foo = @foo, -- this is just a constant value, not a column
  varASC  = ROW_NUMBER() OVER (ORDER BY @foo ASC), 
  varDESC = ROW_NUMBER() OVER (ORDER BY @foo DESC), 
  colASC  = ROW_NUMBER() OVER (ORDER BY name ASC), 
  colDESC = ROW_NUMBER() OVER (ORDER BY name DESC) 
FROM sys.objects --WHERE is_ms_shipped = 0
ORDER BY varASC;

部分的な結果:

name  foo   varASC  varDESC  colASC  colDESC
----  ----  ------  -------  ------  -------
t1    name       1        1       1      100
t2    name       2        2       2       99
t3    name       3        3       3       98
t4    name       4        4       4       97
t5    name       5        5       5       96
------ only column that deviates ----^^^^^^^

の変数値はすべての行@fooで同じであるため、それによる分割と順序付けはまったく意味がありません。

于 2013-11-27T20:12:03.997 に答える