我看过这样的一些问题,但没有回答我正在寻找的问题。
我有超过3年的5,000行数据。每一行都有一个memberID,因此memberIDs重复,并且只对个人而言是唯一的(但如果个人在3年内多次在系统中,它们将在列中重复)。
如何在3年内提取100个随机会员ID? (因此理论上会有超过100行,因为memberID可以重复)
编辑:我应该澄清,会员ID是字符,而不是数字。例如:W4564
注意:这不是在3年的过程中寻找n行,而是寻找100个不同的ID,因此ID可能与结果中的3行相关联。每次运行SQL时,结果都会有不同的行数。
答案 0 :(得分:2)
根据数据的索引方式,您只需从子查询中获取memberID
的行即可。例如:
SELECT *
FROM <yourtable>
WHERE memberID IN (SELECT DISTINCT TOP 100 memberID FROM <yourtable>)
这应该返回随机的memberID,具体取决于你的索引。如果你需要强制它,你可以在评论中的链接问题中做,并随机排序:
SELECT *
FROM <yourtable>
WHERE memberID IN (SELECT DISTINCT TOP 100 memberID FROM <yourtable> ORDER BY newid())
答案 1 :(得分:0)
使用order by newid()
您可以使用随机排序。使用where exists
,您只能隔离过去三年中存在数据的成员。您需要在此阶段执行此操作,否则您可能会意外地仅使用根本没有任何最新数据的成员。
通过添加top 100
,您只需从该集合中选择100行。
组合应该获得过去三年中存在数据的100个随机成员ID:
select top 100
m.MemberID
from
Member m
where
exists (select 'x'
from MemberData d
where d.MemberId = m.MemberId
and d.DataDate > dateadd(year, -3, getdate()))
order by
newid()
然后你可以在in
子句中使用该查询来从同一个MemberData表或任何其他表中获取数据:
select
md.*
from
MemberData md
where
-- Same filter to get only the recent data
md.DataDate > dateadd(year, -3, getdate()) and
-- Only of 100 random members that have been active in the past 3 years.
md.MemberId in (
select top 100
m.MemberID
from
Member m
where
exists (select 'x'
from MemberData d
where d.MemberId = m.MemberId
and d.DataDate > dateadd(year, -3, getdate()))
order by
newid()
)