SQL

时间:2015-07-13 18:32:01

标签: sql sql-server

我看过这样的一些问题,但没有回答我正在寻找的问题。

我有超过3年的5,000行数据。每一行都有一个memberID,因此memberIDs重复,并且只对个人而言是唯一的(但如果个人在3年内多次在系统中,它们将在列中重复)。

如何在3年内提取100个随机会员ID? (因此理论上会有超过100行,因为memberID可以重复)

编辑:我应该澄清,会员ID是字符,而不是数字。例如:W4564

注意:这不是在3年的过程中寻找n行,而是寻找100个不同的ID,因此ID可能与结果中的3行相关联。每次运行SQL时,结果都会有不同的行数。

2 个答案:

答案 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()
  )