【问题标题】:Sampling on two columns SQL对两列 SQL 进行采样
【发布时间】:2017-06-27 13:18:48
【问题描述】:

我在一家进行物业维修的公司工作。每个维修都有一个唯一编号,每个属性(大约 15000 条记录)和每个工人(大约有 30 个)也是如此。每个月我们进行 2000 到 4000 次维修。

为了让公司进行满意度调查,我们需要每个工人每月随机(最好,但可以只使用 TOP)选择 5 个物业,同时确保该物业之前没有在前 3 个内发送过调查月(这将是一个属性)。

基本上我正在寻找一个提示来做以下事情:

+-------+---------+-------+-----------------+ | Place | Worker | Date | previous survey | +-------+---------+-------+-----------------+ | 0001 | 1 | june1 | | | 0002 | 1 | june1 | | | 0003 | 2 | june1 | | | 0004 | 1 | june1 | Y | | 0005 | 2 | june1 | | | 0006 | 2 | june1 | | | 0007 | 1 | june1 | | | 0008 | 1 | june1 | | | 0009 | 1 | june1 | | | 0010 | 2 | june1 | | | 0011 | 1 | june1 | | | 0012 | 2 | june1 | | | 0013 | 1 | june1 | | | 0014 | 1 | june1 | Y | | 0015 | 1 | june1 | | +-------+---------+-------+-----------------+

输出:

Worker | Place 1 |0001 1 |0002 1 |0007 1 |0008 1 |0009 2 |0003 2 |0005 2 |0006 2 |0012 2 |NULL ....等等。

任何帮助将不胜感激,我什至不知道该用谷歌什么来开始整理这个!

【问题讨论】:

  • 您好,欢迎来到 SO。对于初学者,您使用的是 mysql 还是 sql server?它们不是一回事,根据您实际使用的 DBMS,答案会大不相同。
  • MySQL 不支持 TOP(你说的是使用 TOP)所以为什么要标记 MySQL?
  • 对不起!错误标记(第一篇文章)mysql 不应该存在。

标签: sql sql-server reporting-services reportbuilder3.0


【解决方案1】:

您可以轻松地将 ROW_NUMBER 用于此类事情。

https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql

with SortedResults as
(
    select *
        , ROW_NUMBER() over (partition by Worker order by (Select newid())) as RowNum
    from YourTable
    where PreviousSurvey is null --or whatever the predicate would be here
)

select *
from SortedResults
where RowNum <= 5

【讨论】:

  • 这很完美,也很简单。如果表再大一点会不会有问题?
  • 鉴于数据的可能分布,它应该可以很好地扩展。当然,如果您有数百万行,这可能是一个挑战,但所有其他查询也是如此。
【解决方案2】:
SELECT worker_id, place 
FROM <yourtable> 
WHERE previous_survey != 'Y' 
ORDER BY place ASC LIMIT 5

【讨论】:

    猜你喜欢
    • 2017-03-21
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多