3

「PolicyNumber」という名前の列を含む複数の列を持つテーブルがあります

サンプルは次のとおりです。

PolicyNumber

NYH1111
NYD2222
SCH3333
SCS4444
LUH5555
LUS6666
ALH7777
ALW8888
VAH9999
AKH0000
...
NYH1010
NYD2318

このテーブルには1,000以上のレコードがあり、レコードには各ポリシー番号タイプのいくつかが含まれています。たとえば、「NYH」で始まる複数のポリシーや「VAH」で始まる複数のポリシーなどです。

可能なポリシータイプは次のとおりです。

NYH
NYD
SCH
SCS
LUH
LUS
ALH
ALW
VAH
AKH

各ポリシータイプの少なくとも1つを含むSELECTTOP300を実行するにはどうすればよいですか?ポリシータイプは、ポリシー番号の最初の3文字であることを忘れないでください。

これも可能ですか?これの目的は、テスト環境にダンプするために本番環境から300レコードを取得する必要があり、各ポリシーを少なくとも1つ含める必要があることです。それぞれを少なくとも1つ作成したら、完全にランダム化できます。

4

5 に答える 5

1

私の頭のてっぺんから、あなたはすることができます:

SELECT TOP 30 Column1, Column2, Column3, PolicyNumber
FROM YourTable
WHERE PolicyNumber LIKE 'NYH%'

UNION 

SELECT TOP 30 Column1, Column2, Column3, PolicyNumber
FROM YourTable
WHERE PolicyNumber LIKE 'NYD%'

UNION

/* ... remaining eight policy types go here */ 

ORDER BY PolicyNumber /* Or whatever sort order you want */

ただし、あるタイプのXと別のタイプのYの代わりに、毎回30個のタイプが提供されます。

于 2012-09-11T18:25:22.223 に答える
1

私の頭に浮かぶ簡単な方法の1つ..以下のクエリは、ポリシータイプごとに1つのレコードのみを取得します

 SELECT TOP 300 *

 FROM   ( SELECT *,rank1= ROW_NUMBER () OVER (PARTITION BY LEFT (PolicyNo,3) ORDER BY GETDATE ()) FROM MyTable
        ) AS t1

 WHERE  t1.rank1 = 1
于 2012-09-11T18:27:06.470 に答える
1

SQL Server 2005 以降でこれを試してください。

;WITH CTE AS
(
    SELECT  LEFT(PolicyNumber) PolicyType, PolicyNumber, 
            ROW_NUMBER() OVER(PARTITION BY LEFT(PolicyNumber) ORDER BY NEWID()) RN
    FROM YourTable
)
SELECT TOP 300 PolicyNumber
FROM CTE
ORDER BY RN, NEWID()
于 2012-09-11T18:29:33.803 に答える
1

ClearLogic から借用 +1 これが機能する場合は、ClearLogic にチェックを入れてください

WHERE t1.rank1 = 1 の問題は、一意の数が 300 未満の場合、300 未満で停止することです。

 SELECT TOP 300 t1.PolicyNo

 FROM   ( SELECT PolicyNo, rank1= ROW_NUMBER () 
          OVER (PARTITION BY LEFT (PolicyNo,3) ORDER BY NEWID()) 
          FROM MyTable
        ) AS t1

 order by t1.rank, t1.PolicyNo
于 2012-09-11T18:46:59.983 に答える
1

これを試すことができます:

このソリューションでは、最初に、実行するたびにランダムな順序newid()を生成できます。

「各政策から少なくとも 1 つ」という目標を達成するために、AtLeastOneコラムを作成しました。CTEこれにより、最初の一意の 3 文字ごとに、ランダム化されたテーブルから最初の文字が選択されます。電流がこの最初に選択された値と等しい場合は、1 でなければ 0 になります。したがって、このロジックを使用すると、一意の 3 文字それぞれからランダム化された最初Policyの値を選択できます。

Order By注:ポリシー フィールドのみが必要な場合は、このロジックをパーツに直接配置することもできます。(この方法で例を作成し、その背後にあるロジックを可視化しました)

最後のステップでは、AtLeastOne Desc で、次に random で注文するだけIDです。

WITH CTE_Policy
AS
(
  SELECT newid() as  ID, Policy
  FROM Code
)
SELECT TOP 300
Policy,
CASE WHEN Policy = (SELECT TOP 1 Policy FROM cte_Policy c
                    WHERE SUBSTRING(c.Policy,1,3) = 
                      SUBSTRING(CTE_Policy.Policy,1,3))
THEN 1 ELSE 0 END  AS AtLeastOne

FROM CTE_Policy
ORDER BY AtLeastOne DESC, ID

ここにSQLFiddle のデモがあります。

于 2012-09-11T18:41:57.417 に答える