SQL Server 2012中的比例排序

SQL Server 2012中的比例排序,sql,tsql,sql-server-2012,Sql,Tsql,Sql Server 2012,我有一张有125k张唱片的桌子。每天,我插入约20条记录,并根据表中按插入时间排序的前1000条记录生成1000条通知。一旦生成通知,将对其进行标记,并且不再考虑将来的通知传递。这在很长一段时间内运行良好,除了以一种奇怪的方式订购的100k大插入导致一些问题之外 共有4种类型的记录,2列具有两个不同的值,每个列确定这4种类型中的哪一种。根据文件排序,其中一种类型出现在前80k记录中,并主导日常通知 我正在通过在insert上创建一个触发器来解决这个问题,该触发器将以一种每天都有更均匀分布的通知的

我有一张有125k张唱片的桌子。每天,我插入约20条记录,并根据表中按插入时间排序的前1000条记录生成1000条通知。一旦生成通知,将对其进行标记,并且不再考虑将来的通知传递。这在很长一段时间内运行良好,除了以一种奇怪的方式订购的100k大插入导致一些问题之外

共有4种类型的记录,2列具有两个不同的值,每个列确定这4种类型中的哪一种。根据文件排序,其中一种类型出现在前80k记录中,并主导日常通知

我正在通过在insert上创建一个触发器来解决这个问题,该触发器将以一种每天都有更均匀分布的通知的方式对表进行重新排序

我的问题:是否有一个内置的SQL排序函数可以根据列中的数据按比例对结果进行排序

i、 e.我可以根据A列和B列进行80/20分割吗?如果我有以下选项,我可以得到640条1,1记录、160条1,2记录、160条2,1记录和40条2,2记录,而无需执行硬编码的select top X语句,因为有时我不会有640条1,1记录,但我仍然希望总共生成1000个通知

Column A    Column B
1           1
1           2
2           1
2           2
您应该能够使用ROW_NUMBER实现您想要的目标。您没有提供表结构,因此有些是猜测:

;WITH CTE_NumberedRows AS
(
    SELECT
        id,
        column_a,
        column_b,
        some_date,
        ROW_NUMBER() OVER (PARTITION BY column_a, column_b ORDER BY some_date) AS row_num
    FROM
        My_Table
)
SELECT TOP 1000
    id,
    column_a,
    column_b
FROM
    CTE_NumberedRows
ORDER BY
    CASE WHEN column_a = 1 AND column_b = 1 AND row_num <= 640 THEN 0 ELSE 1 END,
    CASE WHEN column_a = 1 AND column_b = 2 AND row_num <= 160 THEN 0 ELSE 1 END,
    CASE WHEN column_a = 2 AND column_b = 1 AND row_num <= 160 THEN 0 ELSE 1 END,
    CASE WHEN column_a = 2 AND column_b = 2 AND row_num <= 40  THEN 0 ELSE 1 END,
    some_date

您是否需要在ASC或DESC订单中的日期之前订购,或者您是否在某个日期订购,目前尚不清楚。不过,希望关于如何做到这一点的一般要点已经足够了。您通过ORDER BY和CASE语句对每种类型的前x行进行优先级排序,然后再按日期排序。

表没有顺序。如果你指望在一张桌子上偶然点餐,那你就犯了一个严重的错误。如果您希望结果集有一个顺序,那么您需要使用ORDERBY子句并指定该顺序是什么。我建议使用top和union构建一个动态语句。这样,您将始终获得1000个结果。此外,请包括您的表结构。如果其中一种类型是短行,规则是什么?你是从其他类型的人那里得到的吗?替换行应使用哪种类型的排序?@TomH-此时使用Identity int列对通知进行排序。根据文件中的顺序插入数据。问题是,一个文件非常大,并且排序方式使得1,2条记录是文件中的前80K行。这通常不会发生,因为我们每天只增加约20个。问题不在于文件。问题是您试图依靠标识列在表中创建顺序。如果您需要顺序来匹配某些类型的规则,那么您需要定义这些规则并强制执行它们。依靠它们以某种方式存在于文件中并以某种方式插入以导致标识以某种方式运行不是一个好计划。我能够用我的列名和表名进行更新,这非常有效。可能会更新一点,但这是伟大的。非常感谢。