【问题标题】:Selecting 1 random item per user. Many tables included in my query每个用户选择 1 个随机项目。我的查询中包含许多表
【发布时间】:2015-09-08 18:14:52
【问题描述】:

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

在我的结果集中,我获取了用户和他们拥有的工作项。我需要的是每个用户只返回一个随机工作项。这就是我卡住的地方。任何帮助将不胜感激。

这是我的代码。我需要的是每个用户 1 个随机 C.credentilaing_k。我正在使用 SQL 2012。

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

【问题讨论】:

  • 任何特定的 rdbms?
  • OP 正在使用 SQL 2012。

标签: sql sql-server random sql-server-2012


【解决方案1】:

获取单个用户 + 凭据记录的最简单方法是进行子选择并加入它。 NEWID 的使用为要基于的行编号创建一个随机 ID。 Partition By 导致在用户 ID 之间重新开始编号。最后,连接中的 Row=1 应该意味着每个用户只能获得 1 条记录。

select 
    rec2get.FULLNAME as 'Chg_By',
    CONVERT(DATE,AL.AUDITDATETIME) as 'DE_Date',
    rec2get.ID,
    rec2get.LONGNAME,
    rec2get.DOB,
    rec2get.CREDENTIALING_K,
    rec2get.entity_k,
    rec2get.CVI_TYPE,
    rec2get.GROUPDESCRIPTION,
    rec2get.APPLICATION_RECEIVED,
    rec2get.Cur_STATUS,
    rec2get.MSO_DUE_DT
from VisualCACTUS.AUDITLOG AL
JOIN (
    SELECT
        Row_Number() OVER (PARTITION BY u.user_k ORDER BY NEWID() ASC) [Row],
        u.user_k,
        u.FULLNAME,
        c.CREDENTIALING_K,
        c.entity_k,
        c.APPLICATION_RECEIVED,
        c.USERDEF_D3  as 'MSO_DUE_DT',
        P.ID,
        CONVERT(DATE,P.DATEOFBIRTH) as 'DOB',
        P.LONGNAME,
        R.DESCRIPTION as 'CVI_TYPE',
        CG.GROUPDESCRIPTION,
        R1.DESCRIPTION as 'Cur_STATUS'
    FROM VisualCACTUS.AUDITLOG AL1
    JOIN VisualCACTUS.USERS U on U.user_k = AL1.USER_K
    join VisualCACTUS.CREDENTIALING C on C.CREDENTIALING_K = AL1.FILE_PRIMARYKEY
    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
) rec2get on rec2get.user_k = AL.USER_K
    AND rec2get.CREDENTIALING_K=AL.FILE_PRIMARYKEY
    AND rec2get.[Row]=1
where
AL.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, AL.AUDITDATETIME) = DATEADD(day, -1, convert(date, GETDATE()))

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2016-10-31
    • 2011-02-28
    • 2017-11-10
    • 1970-01-01
    相关资源
    最近更新 更多