【问题标题】:How to distribute sql results over column x?如何在 x 列上分配 sql 结果?
【发布时间】:2016-07-29 08:51:42
【问题描述】:

我有一张房子的桌子。

City | Address | Price | NewRelease
Auckland, 18 Queen St, 1000000, true
Auckland, 21 Queen St, 1100000, false
Auckland, 23 Queen St, 1150000, false
Wellington, 23 Cuba St, 850000, false
.....

我想要做的是能够查询该列表并返回特定城市中的 x 个房屋的列表,并且我希望该列表在 NewReleases 之间尽可能均衡,所以大约一半是正确的,一半是正确的错误的。该函数需要能够接受关于从一个地区返回多少房屋的输入。类似houses_in_region(amount)

有时可能每个都不足以获得 50/50 的拆分,那么最重要的是刚刚返回总体正确的数字。例如,如果您要求惠灵顿的 10 间房屋,但 db 中惠灵顿只有 12 间房屋,并且全部为 NewRelease=false,那么它应该只返回其中的 10 间。但是,如果您在奥克兰问同样的问题,那里可能有 1000 套,那么您应该退回 10 套房屋,其中 5 套是 NewRelease,5 套不是。

用 sql 可以吗?

感谢你们的帮助!

【问题讨论】:

    标签: sql ruby-on-rails sql-server


    【解决方案1】:

    你可以用这个:

    DECLARE @i int = 6, -- How many rows we want to show
            @s int  --  This will determine what will be inserted first 
    
    DECLARE @Results TABLE ( --Result table
        City nvarchar(100), 
        [Address] nvarchar(100), 
        [Price] int,
        [NewRelease] bit
    )
    
    SELECT @s = CASE WHEN SUM(CASE WHEN NewRelease = 1 THEN 1 ELSE 0 END) > SUM(CASE WHEN NewRelease = 0 THEN 1 ELSE 0 END) THEN 0 ELSE 1 END
    FROM YourTable
    
    INSERT INTO @Results  -- Insert half of needed rows
    SELECT TOP (@i/2) *
    FROM YourTable 
    WHERE NewRelease = @s
    
    SELECT @i = @i-COUNT(*)  --Re-count how many rows we need more
    FROM @Results
    
    INSERT INTO @Results --Insert another part of rows
    SELECT TOP (@i) *
    FROM YourTable 
    WHERE NewRelease != @s
    
    SELECT *  --show data selected
    FROM @Results
    ORDER BY NewRelease DESC
    

    【讨论】:

      猜你喜欢
      • 2022-08-21
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多