为结果中返回的每个用户选择随机记录

时间:2015-07-24 17:07:29

标签: sql random

我已经看到了几种使用多种方法从表中选择随机记录的方法。但是,我的需要我肯定在这里,我只是找不到它。我有一个使用几个表的查询。我的最终目标是为每个返回的用户提供一条随机记录。

在我的结果集中,我获得了用户和他们拥有的工作项。我需要的是每个用户只返回一个随机工作项。这是我陷入困境的地方。非常感谢ANy的帮助。

这是我的代码。我需要的是每个用户1个随机的C.credentilaing_k。

select 
    U.FULLNAME as 'Chg_By',
    CONVERT(DATE,AL.AUDITDATETIME) as 'DE_Date',
    P.ID,
    P.LONGNAME,
    CONVERT(DATE,P.DATEOFBIRTH) as 'DOB',
    C.CREDENTIALING_K,
    C.entity_k,
    R.DESCRIPTION as 'CVI_TYPE',
    CG.GROUPDESCRIPTION,
    C.APPLICATION_RECEIVED,
    R1.DESCRIPTION as 'Cur_STATUS',
    CONVERT(DATE,C.USERDEF_D3) as 'MSO_DUE_DT'
from
    VisualCACTUS.AUDITLOG AL
        JOIN VisualCACTUS.USERS U
        on U.user_k = AL.USER_K
        join VisualCACTUS.CREDENTIALING C
            JOIN VisualCACTUS.PROVIDERS P
            on P.provider_k = C.PROVIDER_K
            JOIN visualcactus.CREDENTIALINGGROUP CG
            on CG.CREDENTIALINGGROUP_K = C.CREDENTIALINGGROUP_K
            JOIN VisualCACTUS.REFTABLE R
            on R.reftable_k = C.TYPE_RTK
            JOIN VisualCACTUS.REFTABLE R1
            ON R1.REFTABLE_K = C.CREDENTIALINGSTATUS_RTK
        on C.CREDENTIALING_K = AL.FILE_PRIMARYKEY
where
    AUDITLOG_K in (select AUDITLOG_K from VisualCACTUS.AUDITLOG_RECORDLEVEL where TABLE_NAME = 'CREDENTIALING                 ' 
                    and
                    AUDITLOG_RECORDLEVEL_K in (SELECT AUDITLOG_RECORDLEVEL_K from VisualCACTUS.AUDITLOG_FIELDLEVEL where NEWVALUE_SHORT = 'D2LC0YSXXW'))
    and
    CONVERT(DATE, AUDITDATETIME) = DATEADD(day, -1, convert(date, GETDATE()))

2 个答案:

答案 0 :(得分:2)

我认为你需要这样的东西(在T-SQL中):

SELECT *
FROM (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY NEWID()) rn
    FROM yourTable) dt
WHERE
    rn = 1;

答案 1 :(得分:2)

如果用户有多个记录,您想要获取用户的随机记录。我们可以采取以下措施(在Teradata中):

select 
    * 
from tablename
where
    qualify row_number() (over partition by id order by column) = 1;

下面:
partition by - 可以使用逗号分隔多个列,因为您希望根据几列来隔离数据。

order by - 可以根据您的偏好安排该细分受众群中的数据,也可以根据您的数据按日期或其他任何方式进行排列。

=1 - 表示其中第一个。