Php 结合Union中的Distinct和TOP 1 | SQL SERVER 2012
我有以下SQL查询:Php 结合Union中的Distinct和TOP 1 | SQL SERVER 2012,php,sql,sql-server,sqlsrv,Php,Sql,Sql Server,Sqlsrv,我有以下SQL查询: SELECT DISTINCT LEFT (employeeidno, 4)deptcode from employeemasterfile ORDER BY deptcode ASC 将D001的DISTINCT值生成到D051 SELECT TOP 1 RIGHT (employeeidno, 7) empno from employeemasterfile ORDER BY empno DESC 产生0000267的值 我在这里试图实现的是,D001到
SELECT DISTINCT LEFT (employeeidno, 4)deptcode
from employeemasterfile
ORDER BY deptcode ASC
将D001
的DISTINCT
值生成到D051
SELECT TOP 1 RIGHT (employeeidno, 7) empno
from employeemasterfile
ORDER BY empno DESC
产生0000267的值
我在这里试图实现的是,D001
到D051
的每个不同的值都应该产生它的TOP 1
值
这就是我想要达到的目标
deptcode :D001; empno: 0000016
deptcode :D002; empno: 0000024
deptcode :D004; empno: 0000029
deptcode :D005; empno: 0000020
deptcode :D006; empno: 0000056
deptcode :D007; empno: 0000164
deptcode将显示所有唯一的D001-D007,empno将显示每个唯一deptcode的TOP1
不幸的是,我不能这样做,因为如果我要添加一个新参数,UNION将不起作用
在这个问题上,我可以请求你的帮助吗
示例数据如下所示
D0010000001
D0010000002
D0010000003
D0010000004
D0010000005
D0010000006
D0010000007
D0010000008
D0010000009
D0010000010
D0010000011
D0010000012
D0010000013
D0010000014
D0010000015
D0010000016
D0020000001
D0020000002
D0020000003
D0020000004
D0020000005
D0020000006
D0020000007
D0020000008
D0020000009
D0020000010
D0020000011
D0020000012
D0020000013
D0020000014
D0020000015
D0020000016
D0020000017
D0020000018
D0020000019
以此类推,直到D052000001您可以使用row_number()
您可以使用row_number()
您可以使用左分组(employeeidno,4)
:
您可以使用左分组(employeeidno,4)
:
据我所知,我应该这样做
SELECT left(employeeidno, 4) deptcode,
max(right(employeeidno, 7)) empno
FROM employeemasterfile
GROUP BY left(employeeidno, 4)
ORDER BY left(employeeidno, 4);
编辑:
我试着解释一下:
您可以想象GROUP BY left(employeeidno,4)
将记录集划分为多个子集。在每个子集中,左(employeeidno,4)
,即deptno
是相同的,没有两个子集具有相同的deptno
。现在在每个子集max(right(employeeidno,7))
取最大right(employeeidno,7)
即最大empno
。(通过empno DESC执行顺序
将结果限制为具有TOP 1
的一行也会使您获得最大值。)然后通过获取每个子集的deptno
(即每个deptno
一次)和最大empno
生成最终结果,我认为聚合应该这样做
SELECT left(employeeidno, 4) deptcode,
max(right(employeeidno, 7)) empno
FROM employeemasterfile
GROUP BY left(employeeidno, 4)
ORDER BY left(employeeidno, 4);
编辑:
我试着解释一下:
您可以想象GROUP BY left(employeeidno,4)
将记录集划分为多个子集。在每个子集中,左(employeeidno,4)
,即deptno
是相同的,没有两个子集具有相同的deptno
。现在在每个子集max(right(employeeidno,7))
取最大right(employeeidno,7)
即最大empno
。(通过empno DESC执行命令
将结果限制为一行,使用TOP 1
也可以获得最大值。)然后通过获取每个子集的deptno
(即每个deptno
一次)和最大empno
来生成最终结果,如果您不介意的话,请您尽可能简单地解释一下这个sql查询,我了解其中的一些,例如,我不明白MAX()如何对所有内容进行排序,因为查询将逐个加载它。GROUP by LEFT(employeeidno,4)
返回不同的LEFT(employeeidno,4)
值,每个值的最大值为RIGHT(employeeidno,7)
。这是降序排序时得到的最大值,并得到前1。谢谢你,现在已经清楚了。抱歉,我双击了检查按钮。谢谢你,如果你不介意的话,请你尽可能简单地解释这个sql查询,我理解其中一些,例如,我不理解MAX()可以对所有内容进行排序,因为查询将逐个加载。GROUP by LEFT(employeeidno,4)
返回LEFT(employeeidno,4)
的不同值,并为每个值返回RIGHT(employeeidno,7)的最大值
。这是降序排序时得到的最大值,并得到了前1。谢谢你,现在已经清楚了。抱歉,我双击了检查按钮。谢谢你,如果你不介意的话,请你尽可能简单地解释一下这个sql查询,我理解其中一些,例如,我不理解MAX()可以对所有内容进行排序,因为查询将逐个加载。谢谢!我通常不使用MAX(),但我想我现在明白了,这比尝试通过UNION
来做要好。谢谢你。谢谢你,如果你不介意的话,请你尽可能简单地解释一下这个sql查询,我理解其中的一些,例如,我不明白MAX()是怎么做的可以对所有内容进行排序,因为查询将逐个加载它。谢谢!我通常不使用MAX(),但我想我现在就知道了,这比尝试通过UNION
执行要好。谢谢。
SELECT
LEFT(employeeidno, 4) deptcode,
MAX(RIGHT(employeeidno, 7)) empno
FROM employeemasterfile
GROUP BY LEFT(employeeidno, 4)
ORDER BY LEFT(employeeidno, 4)
SELECT left(employeeidno, 4) deptcode,
max(right(employeeidno, 7)) empno
FROM employeemasterfile
GROUP BY left(employeeidno, 4)
ORDER BY left(employeeidno, 4);