我已经看到了几种使用多种方法从表中选择随机记录的方法。但是,我的需要我肯定在这里,我只是找不到它。我有一个使用几个表的查询。我的最终目标是为每个返回的用户提供一条随机记录。
在我的结果集中,我获得了用户和他们拥有的工作项。我需要的是每个用户只返回一个随机工作项。这是我陷入困境的地方。非常感谢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()))
答案 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
- 表示其中第一个。