Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 秩或密秩_Sql_Sql Server - Fatal编程技术网

Sql 秩或密秩

Sql 秩或密秩,sql,sql-server,Sql,Sql Server,我试图为下面的数字分配一个“部分”。我甚至不确定密集的排名是否会起作用。基本上,它应该通过seq和UniqueLoc分配。因此,它应该查看seq 0,然后是UniqueLoc 99137-4529,分配第1节,然后移动到seq 1,如果UniqueLoc匹配,则应分配第1节,如果不匹配,则分配第2节。下面是我的SQL和我的结果:正如您所看到的,它正在进行密集排序,但不是按照我需要的顺序。应该是1,2,3,3 UniqueLoc seq loadnumber SwineMovement

我试图为下面的数字分配一个“部分”。我甚至不确定密集的排名是否会起作用。基本上,它应该通过seq和UniqueLoc分配。因此,它应该查看seq 0,然后是UniqueLoc 99137-4529,分配第1节,然后移动到seq 1,如果UniqueLoc匹配,则应分配第1节,如果不匹配,则分配第2节。下面是我的SQL和我的结果:正如您所看到的,它正在进行密集排序,但不是按照我需要的顺序。应该是1,2,3,3

UniqueLoc   seq loadnumber  SwineMovement   sectionrow  section
99137-4529  0   304360             304360          1     2
99137-4530  1   304360             3043601         1     1
99079-4530  2   304360             3043602         1     3
99079-4530  3   304360             3043603         2     3

select *,
DENSE_RANK () over ( partition by loadnumber, uniqueloc order by   seq )   as sectionrow ,
DENSE_RANK () over (  partition by Loadnumber   order by     uniqueloc desc )   as section 
from test
order by loadnumber, seq


我认为排序应该首先是
UniqueLoc
列中的最后四位数字升序,然后是同一列的前五位数字降序:

SELECT *,
    DENSE_RANK() OVER (PARTITION BY loadnumber
                       ORDER BY
                           SUBSTRING(UniqueLoc,
                           CHARINDEX('-', UniqueLoc) + 1,
                           LEN(UniqueLoc) - CHARINDEX('-', UniqueLoc)),
                           SUBSTRING(UniqueLoc, 1, CHARINDEX('-', UniqueLoc) - 1) DESC) dr
FROM test
ORDER BY
    loadnumber, seq;
您从未告诉我们您的数据库,但如果它支持
LEFT
RIGHT
功能,那么您可以使用以下cleaner
ORDER BY

ORDER BY RIGHT(UniqueLoc, 4), LEFT(UniqueLoc, 5) DESC
输出:

此处演示:


演示是在SQL Server中进行的,因为我认为您的
select*
语法在Oracle上可能会失败,而Postgres可能是唯一的候选者。

根据您的预期结果,排序将始终在seq列上

SELECT uniqueloc,
       seq,
       loadnumber,
       swinemovement,
       DENSE_RANK() OVER (PARTITION BY loadnumber 
                              ORDER BY CASE WHEN seq<> rnum
                                            THEN CONCAT(CAST(seq-rnum AS VARCHAR),uniqueloc)
                                            ELSE uniqueloc
                                        END) [rank]
  FROM (SELECT *,
               (ROW_NUMBER() OVER (PARTITION BY loadnumber 
                                       ORDER BY uniqueloc) - 1) rnum
          FROM t_load
       ) t
 ORDER BY loadnumber, 
          seq;

也许没有必要在这里按分区?@LONG我想你是对的,我现在正在尝试添加一个演示。这是可行的,但一旦我向表中添加更多负载,它就不起作用了。我正在创建另一个日期集,以包含在该日期集中。只需几分钟,单列顺序装载编号SwineMovement dr 99137-4529 0 304360 304360 3 99137-4530 1 304360 3043601 4 99079-4530 2 304360 3043602 5 99079-4530 3 304360 3043603 5 2519-3982 0 304468 304468 7 2632-3982 1 304468 3044686 104004-8230 304873 304873 304873 2 104004-821 304873 304873 3048732104007-8035 2 304873 3048732 1 104007-8035 3 304873 3048733 1 104007-8232 4 304873 3048734 2 104007-8232 5 304873 3048733 3048735 2你没有看到我的上述评论吗?使用数据库类型和新数据更新您的问题。在不知道您使用的数据库种类的情况下,我无法回答您更新的数据。请更新您的问题并告诉我们您使用的数据库(例如SQL Server、Postgres)。通过在每行数据中添加四个空格,将您的数据包括在问题中。这将把数据格式化为单间距代码,易于阅读。
SELECT uniqueloc,
       seq,
       loadnumber,
       swinemovement,
       DENSE_RANK() OVER (PARTITION BY loadnumber 
                              ORDER BY CASE WHEN seq<> rnum
                                            THEN CONCAT(CAST(seq-rnum AS VARCHAR),uniqueloc)
                                            ELSE uniqueloc
                                        END) [rank]
  FROM (SELECT *,
               (ROW_NUMBER() OVER (PARTITION BY loadnumber 
                                       ORDER BY uniqueloc) - 1) rnum
          FROM t_load
       ) t
 ORDER BY loadnumber, 
          seq;
uniqueloc   seq loadnumber  swinemovement   rank
99137-4529  0   304360      304360          1
99137-4530  1   304360      3043601         2
99079-4530  2   304360      3043602         3
99079-4530  3   304360      3043603         3
2519-3982   0   304468      304468          1
2632-3982   1   304468      3044681         2
104004-8232 0   304873      304873          1
104004-8232 1   304873      3048731         1
104007-8035 2   304873      3048732         2
104007-8035 3   304873      3048733         2
104007-8232 4   304873      3048734         3
104007-8232 5   304873      3048735         3
99137-4529  0   900000      304360          1
99079-4530  1   900000      3043601         2
99079-4530  2   900000      3043602         2
99137-4530  3   900000      3043603         3