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

如何进行 SELECT TOP 300,其中至少包含每种策略类型中的一种?请记住,保单类型是保单编号的前 3 个字母。

这甚至可能吗?这样做的目的是我必须从生产中获取 300 条记录以转储到测试环境中,并且我需要包含每个策略中的至少 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 */

但是,它每次都会给你每种类型的 30 个,而不是一种类型的 X 和另一种类型的 Y。

于 2012-09-11T18:25:22.223 回答
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

你可以试试这个:

在此解决方案中newid(),您首先可以通过每次运行生成随机顺序。

为了实现“每项政策至少一项”的目标,我制作了AtLeastOne专栏。这会从随机CTE表中为每个唯一的三个字母在开始时选择第一个。如果电流Policy等于第一个选择的值,则它得到 1,否则为 0。因此,使用此逻辑,您可以从每个唯一的三个字母中选择一个随机的第一个。

Order By注意:如果您只需要 Policy 字段,也可以将此逻辑直接放入部件中。(我以这种方式制作了示例,以使其背后的逻辑可见)

在最后一步中,您只需按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 回答
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 回答