SQL随机样本表,带有重复项

时间:2016-09-07 09:51:30

标签: sql sql-server

假设我有下表:

       unitid  |  transtatus |   currency
    ---------------------------------------
    1024393230 | not_started |  GBp - Pence
    1024397398 | in_progress |  GBp - Pence
    1024397398 | not_started |  USd - Cent
    1024397408 | not_started |  GBp - Pence
    1024397408 | not_started |  EUR
    1024401371 | not_started |  GBp - Pence
    1024403375 | in_progress |  GBp - Pence

我想为QC选择随机行我可以通过

来完成
select top 3  
tbble.unitid,tbble.transtatus, tbble.currency
 from tbble
order by newid()

然而,由于某些行共享相同的unitid(如果是这种情况),我想拉出与此unitid关联的所有行

因此查询将返回:(如果随机行只有一行用于此unitid)

      unitid   | transtatus  |  currency
    ---------------------------------------
    1024393230 | not_started | GBp - Pence
    1024401371 | not_started | GBp - Pence
    1024403375 | in_progress | GBp - Pence

或:(如果与此unitid关联的两行)

    1024397398 | in_progress | GBp - Pence
    1024397398 | not_started | USd - Cent
    1024401371 | not_started | GBp - Pence
    1024403375 | in_progress | GBp - Pence

我不确定如何实现这一目标。也许首先计算单位出现次数然后如果计数超过1然后将这些加到初始随机样本中?

3 个答案:

答案 0 :(得分:2)

也许您可以使用子查询分两步工作:首先使用子查询选择一些随机unitid,然后对于每个子查询,使用相同的{{1}选择表中的整行}。它应该是这样的:

unitid

答案 1 :(得分:1)

您应该使用WITH TIES子句来获取匹配的行

select top 3   WITH TIES *
tbble.unitid,tbble.transtatus, tbble.currency
 from tbble
order by newid()

答案 2 :(得分:1)

我认为这可以实现您想要的,即三个随机单位ID及其所有行:

select t.*
from tbble t join
     (select top 3 t.unitid
      from (select distinct t.unitid from tbble t) t
      order by newid()
     ) tt
     on t.unitid = tt.unitid