【问题标题】:Multiple grouping by多个分组依据
【发布时间】:2013-05-26 23:49:49
【问题描述】:

假设我有一张包含商家信息的表格。

我希望我的结果集按此顺序显示,但只有一个查询:

首先:按 created_date 的顺序显示最近创建的 5 个列表。 然后:以随机顺序显示其余部分。

我的领域:

[BusinessName]
[Date_Created]

因此,如果表中有 100 个企业,我希望列表显示最近创建的 5 个,然后以随机顺序显示其余的。

提前感谢您的帮助!

【问题讨论】:

  • 请发布您的尝试。
  • 这听起来像是一个相当奇怪的要求。为什么需要对条目 5 之外的所有内容进行随机排序?
  • @MitchWheat - 我的尝试不存在。不是因为懒惰,而是我不知道如何做到这一点。
  • @lins314159 - 我有一个滑块,每次页面加载时都会以随机顺序显示商家信息。我打算在最近添加的那些上创建一个条件,并在它们的某处放置一个“新”标志……但为了公平起见,我希望它们在每次页面加载时以随机顺序加载。我之前的解决方案是两个单独的查询,但使用一个网格滑块并不能很好地实现我的总体目标。

标签: sql sql-server tsql group-by


【解决方案1】:

选项 A - 将前 5 个和其余的分成两个子查询并使用 UNION 选择它们

WITH CTE_TOP5 AS 
(
    SELECT TOP 5  BusinessName, Date_Created, ROW_NUMBER() OVER (ORDER BY DATE_CREATED DESC) RN FROM dbo.YourTable
    ORDER BY Date_Created DESC 
)
, CTE_REST AS 
(
    SELECT  BusinessName, Date_Created FROM dbo.YourTable
    EXCEPT 
    SELECT  BusinessName, Date_Created  FROM CTE_TOP5
)
,CTE_RESTRANDOM AS
(
    SELECT  BusinessName, Date_Created, ROW_NUMBER() OVER (ORDER BY NEWID()) + 5 RN FROM CTE_REST
)
SELECT * FROM CTE_TOP5
UNION ALL
SELECT * FROM CTE_RESTRANDOM
ORDER BY RN

选项 B - CASE in ORDER BY

;WITH CTE_TOP5 AS 
(
    SELECT TOP 5 *, ROW_NUMBER() OVER (ORDER BY DATE_CREATED DESC) RN FROM dbo.YourTable
    ORDER BY Date_Created DESC 
)
SELECT yt.*
FROM dbo.YourTable yt
LEFT JOIN CTE_TOP5 t5 ON yt.BusinessName = t5.BusinessName 
                     AND yt.Date_Created = t5.Date_Created
ORDER BY CASE WHEN t5.RN IS NOT NULL THEN t5.RN ELSE 6 END, NEWID()

选项 C - 与 B 类似,但没有 CTE、ROW_NUMBERS 和 JOINS - 整个逻辑进入 ORDER BY

SELECT *
FROM dbo.YourTable yt
ORDER BY CASE WHEN yt.Date_Created IN (SELECT TOP 5 yt2.Date_Created 
                                       FROM dbo.YourTable yt2 
                                       ORDER BY yt2.Date_Created DESC)
                 THEN yt.Date_Created 
              ELSE '1900-01-01' 
          END DESC, NEWID()

【讨论】:

  • 非常感谢!我实际上发现选项 C 最容易实现。感谢您的快速回复和帮助.. 非常感谢!
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
相关资源
最近更新 更多