![](/img/trans.png)
[英]How do I construct my WHERE clause to pull records based on this specific criteria?
[英]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.