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