簡體   English   中英

如何根據標准選擇包含記錄的TOP X?

[英]How do I SELECT TOP X where it INCLUDES records based on a criteria?

我有一個表,有多個列,包括一個名為“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條。 在我至少有一個之后,它可以完全隨機化。

在我的頭頂,你可以這樣做:

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.

一個快速的方式,我想到..下面的查詢將獲取每個策略類型只有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

嘗試使用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()

你可以試試這個:

在這個解決方案中,首先有newid() ,您可以通過每次運行生成隨機順序。

為了實現“每個政策中至少一個”目標,我制作了AtLeastOne專欄。 這將從隨機CTE表中為開始時每個唯一的三個字母選擇第一個。 如果當前Policy等於第一個選定值,則它得到1,否則為0.因此,使用此邏輯,您可以從每個唯一的三個字母中選擇一個隨機的第一個。

注意:如果只需要Policy字段,也可以將此邏輯直接放入Order By部分。 (我通過這種方式制作了示例,使其背后的邏輯可見)

在最后一步中,您只需要通過AtLeastOne Des c訂購,然后按隨機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演示

借用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM