Php 结合Union中的Distinct和TOP 1 | SQL SERVER 2012

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到

我有以下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
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);