【问题标题】:How do I make an algorithm to prioritize by date and / or source?如何使算法按日期和/或来源进行优先级排序?
【发布时间】:2020-02-10 08:11:57
【问题描述】:

我对这个我必须在 sql 中执行的算法有点坚持。 我在表格中有产品代码、产品名称、供应商和产品更新日期。 我需要根据情况按供应商和日期对产品进行优先级排序。例如,如果一个产品有 1,2 和/或 3 作为供应商,则必须选择更新率最高的产品。 但如果产品有供应商4、5和/或6,则必须选择供应商编号最少的产品。

如果查询大于或等于 1,则在游标中进行此查询,将行中的第一个数据插入到另一个表中。这是我目前拥有的

    SELECT @QUERY = count (*)  from (
SELECT TOP 1 
   code_product,update_date,supplier,name_product 
FROM Product_updates
WHERE ( supplier = 1 OR supplier =2 OR supplier = 3 ) and code_product 
    = @code_product and code_product is not null 
order by  update_date DESC 
) a 

实际例子,这里是表格

    code_product    name_product    supplier    update_date
    1313                   A            1       11-03-2019
    1313                   A            3       12-10-2019
    1313                   A            2       11-10-2019
    1313                   A            6       13-10-2019
    1515                   B            5       13-10-2019
    1515                   B            4       13-02-2018
    1515                   B            6       15-04-2019

和预期的结果

    code_product    name_product    supplier    update_date
    1313                 A               3        12-10-2019
    1515                 B               4        13-02-2018

请帮忙,问候。

【问题讨论】:

  • “最少供应商数量”是什么意思?这些数字是供应商或等级的 ID?
  • @mohkamfer 是一个行列
  • 为什么不直接通过其他供应商订购?按升序排列。所以它变成了 ORDER BY update_date DESC,供应商 ASC

标签: sql sql-server performance stored-procedures cursor


【解决方案1】:

您可以使用row_number() 来确定优先级:

select pu.*
from (select pu.*,
             row_number() over (partition by code_product
                                order by (case when supplier in (1, 2, 3) then update_date desc,
                                         update_date asc
                               ) as seqnum
      from product_updates pu
     ) pu
where seqnum = 1;

【讨论】:

    【解决方案2】:

    您可以通过 case 对供应商值进行一些操作

        Select code_product, name_product, 
          Case when 1 =max(Case 
          when 
                  supplier in 
              (1,2,3) 
            then 1
             else 2 end) then max(date) 
            Else min(date) end
          from table group by code_product, 
          name_product, (Case when 1 
             =max(Case 
                when 
                  supplier in 
              (1,2,3)
            then 1
             else 2 end) then max(date) 
            Else min(date) end) 
    

    【讨论】:

    • 请解释你的答案。
    • 已更新。立即查看
    猜你喜欢
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2019-10-04
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多