【问题标题】:Iterated sub sampling against distinct values, union results针对不同值的迭代子采样,联合结果
【发布时间】:2018-06-02 04:20:43
【问题描述】:

我发了SQL fiddle here

我有一个表格,其中包含每一行:一个类别、一个文档 ID 和一个排名。

类别在其内部进行排名。对于每个类别,我想选择一个子样本。所有的子样本都应该放在一个表格中。

问题是我想通过迭代地在该类别中获取减半的行索引来进行子采样,例如如果给定类别有 32 个项目,那么我想获取第 32、16、8、4、2、1 行。

在我的SQL fiddle 中,我能够为一个特定类别执行此操作,但我不知道如何:

a) 为 [主要关注领域] 中的所有类别执行此操作 b) 将生成的子样本合并到一个表中

非常感谢任何提示或帮助!我在 TSQL (MS SQL Server) 中工作

样本数据(MS Sql):

CREATE TABLE Rank_MajorAreas
    ([Rank] int, [Major Focus Area] varchar(17), [ID] int)
;

INSERT INTO Rank_MajorAreas
    ([Rank], [Major Focus Area], [ID])
VALUES
    (1, 'Welfare', 71366),
    (2, 'Welfare', 70415),
    (3, 'Truck Driving', 70423),
    (4, 'Peasant''s Office', 74566),
    (5, 'Peasant''s Office', 71560),
    (6, 'Nail Therapy', 77497),
    (7, 'Truck Driving', 76193),
    (8, 'Truck Driving', 79226),
    (9, 'Truck Driving', 70222),
    (10, 'Welfare', 77336),
    (11, 'Truck Driving', 70823),
    (12, 'Welfare', 77096),
    (13, 'Welfare', 71335),
    (14, 'Nail Therapy', 73551),
    (15, 'Welfare', 72146),
    (16, 'Truck Driving', 74023),
    (17, 'Welfare', 71546),
    (18, 'Nail Therapy', 74755),
    (19, 'Peasant''s Office', 77834),
    (20, 'Welfare', 75667),
    (21, 'Peasant''s Office', 71342),
    (22, 'Peasant''s Office', 77457),
    (23, 'Peasant''s Office', 77923),
    (24, 'Welfare', 76508),
    (25, 'Welfare', 75714),
    (26, 'Welfare', 73654),
    (27, 'Welfare', 75753),
    (28, 'Truck Driving', 71481),
    (29, 'Truck Driving', 79424),
    (30, 'Peasant''s Office', 76143),
    (31, 'Truck Driving', 74076),
    (32, 'Nail Therapy', 78714),
    (33, 'Nail Therapy', 79924),
    (34, 'Welfare', 71482),
    (35, 'Welfare', 70050),
    (36, 'Welfare', 76053),
    (37, 'Nail Therapy', 79591),
    (38, 'Peasant''s Office', 75197),
    (39, 'Nail Therapy', 74104),
    (40, 'Welfare', 72891),
    (41, 'Truck Driving', 73621),
    (42, 'Peasant''s Office', 71713),
    (43, 'Welfare', 71979),
    (44, 'Peasant''s Office', 71601),
    (45, 'Peasant''s Office', 73928),
    (46, 'Nail Therapy', 71759),
    (47, 'Nail Therapy', 70379),
    (48, 'Welfare', 71215),
    (49, 'Truck Driving', 70908),
    (50, 'Welfare', 71989)
;

到目前为止的代码:

CREATE VIEW MFA AS
  SELECT ROW_NUMBER() OVER(ORDER BY fa.[Rank] ASC) AS Row
        ,*
  FROM Rank_MajorAreas AS fa
  -- ideally we could make a view per Focus Area
  WHERE fa.[Major Focus Area] = 'Welfare'
  ORDER BY Row ASC
  OFFSET 0 ROWS;

DECLARE @start int
SELECT @start = (SELECT COUNT(*) FROM MFA)

;WITH Sample( Row ) AS
(
  Select @start as Row
    UNION ALL
  SELECT ROUND(Row/2, 0)
    FROM Sample
    WHERE Row > 0
)
SELECT * FROM MFA AS mfa
INNER JOIN Sample AS s on s.Row = mfa.Row
ORDER BY mfa.Row ASC

Desired Results,其中每个焦点区域都经过二次采样,子样本作为单个结果一起返回

Row Rank    Major Focus Area    ID
1   1   Welfare 71366   
2   2   Welfare 70415   
4   12  Welfare 77096   
9   24  Welfare 76508   
19  50  Welfare 71989   
...
1   6   Nail Therapy    77497
2   14  Nail Therapy    73551
4   32  Nail Therapy    78714
9   47  Nail Therapy    7037

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • 样本数据的预期结果是什么?
  • 复制代码,从 sql fiddle @GordonLinoff 查询
  • 添加了预期结果@cdaiga

标签: sql sql-server tsql


【解决方案1】:

您需要在OVER 子句中的Major Focus Area 列上使用PARTITION BY。以下是修改后的TSQL

CREATE VIEW MFA AS
  SELECT ROW_NUMBER() OVER(PARTITION BY fa.[Major Focus Area] ORDER BY fa.[Rank] ASC) AS Row
        ,*
  FROM Rank_MajorAreas AS fa
  -- ideally we could make a view per Focus Area
  ORDER BY [Major Focus Area], Row ASC
  OFFSET 0 ROWS;

DECLARE @start int
SELECT @start = (SELECT COUNT(*) FROM MFA)

;WITH Sample( Row, fa ) AS
(
  Select COUNT(*) as Row, [Major Focus Area] as fa  FROM MFA GROUP BY [Major Focus Area]
    UNION ALL
  SELECT ROUND(Row/2, 0), fa
    FROM Sample
    WHERE Row > 0
)

SELECT mfa.Row, mfa.Rank, mfa.[Major Focus Area] FROM MFA AS mfa
 INNER JOIN Sample AS s on s.Row = mfa.Row and s.fa=mfa.[Major Focus Area]
 ORDER BY [Major Focus Area], mfa.Row ASC

SQL fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2010-12-28
    • 2018-06-17
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    相关资源
    最近更新 更多