【问题标题】:Need query to use in ssis that returns 5 random row results from other query需要在 ssis 中使用从其他查询返回 5 个随机行结果的查询
【发布时间】:2019-09-20 14:51:40
【问题描述】:

我是 SSIS 和复杂 sql 语句的新手。我正在尝试将我的查询与上个月的日期相结合,然后获取这些结果并从中获得 5 个真正随机的行。

我在获得 5 个随机行之前的查询是:

SELECT 
    DISTINCT
    isnull(dbo.fnRemovePatternFromString(p.Last_Name, '%[,-.'']%'), '')  as [Last]
    ,isnull(dbo.fnRemovePatternFromString(p.First_Name, '%[,-.'']%'), '') as [First]
    ,isnull(dbo.fnRemovePatternFromString(p.Middle_Initial, '%[,-.'']%'), '') as [Middle]
    ,isnull(pf.Date_on_staff, '') as [Date on Staff]
    ,pf.Status_from_date
FROM person p
inner JOIN person_facilities pf ON p.Person_ID = pf.Person_ID
LEFT JOIN usr_FacultyMember fm ON p.Person_ID = fm.person_id


WHERE 
    pf.FacCode in ('s', 'H', 'E')
and 
    (
      pf.Status_from_date >= (getdate()-31 ) 
      and pf.Status_from_date < getdate()
    )

返回大约 300 行,但每个月都会更改。

根据该结果,我需要从结果中随机抽取 5 行。它不能是结果的顶部,也不能是结果的 1/5 处的 5 行。我想避免创建一个视图来将结果存储在this example 中。

Tablesample 看起来不像我需要的,因为它不是随机的。

我正在尝试应用this example,因为它看起来是随机的,但我需要控制输出中的行数。 This 有类似的答案。 这是我喜欢这两个例子的部分:

(abs(cast((binary_checksum(*) * rand()) as int)) % 100) <10

我不确定如何控制输出,所以我只能从中得到 5 行。我正在考虑创建一个变量并存储 10 需要返回 5 行,但我不知道该怎么做。有什么想法吗?

我正在查看 variable for count of rows,但我不确定我会用它做什么或如何将它应用到我的 rand 线。

我想它不必是一个 sql 查询,但我仍然不确定如何在 ssis 中执行此操作。如果我必须创建一个视图,我可以,但我不想让我的数据库与视图杂乱无章。

任何帮助解决这个复杂的问题将不胜感激。

更新: 这与random-number-on-sql-without-using-newid 不同,因为我不排除 newid 的顺序,我只是试图找到返回的随机 5 行。

【问题讨论】:

标签: sql random sql-server-2008-r2 row


【解决方案1】:

可能有多个逻辑来实现一些随机化,我想到了对列 id/日期取模。

 SELECT 
        DISTINCT
        isnull(dbo.fnRemovePatternFromString(p.Last_Name, '%[,-.'']%'), '')  as [Last]
        ,isnull(dbo.fnRemovePatternFromString(p.First_Name, '%[,-.'']%'), '') as [First]
        ,isnull(dbo.fnRemovePatternFromString(p.Middle_Initial, '%[,-.'']%'), '') as [Middle]
        ,isnull(pf.Date_on_staff, '') as [Date on Staff]
        ,pf.Status_from_date
    FROM person p
    inner JOIN person_facilities pf ON p.Person_ID = pf.Person_ID
    LEFT JOIN usr_FacultyMember fm ON p.Person_ID = fm.person_id


    WHERE 
        pf.FacCode in ('s', 'H', 'E') order by MOD( sysdate-date,2 )

【讨论】:

    【解决方案2】:

    为什么不直接使用top/fetchorder by newid()

    select top (5) t.*
    from (<your query here>) t
    order by newid();
    

    【讨论】:

    • 因为要求返回的行必须是随机的。 Top 不会给出随机行。我认为 newid 的 order 只是从 select 中获取前 5 名并以不同的方式对它们进行排序,对吗?
    • 我正在阅读有关 newid 的更多信息,它看起来确实从描述中的输出返回 5 个随机行。谢谢!
    猜你喜欢
    • 2017-05-24
    • 2016-08-14
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2015-04-12
    • 2018-02-11
    相关资源
    最近更新 更多