Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 按ID选择最小序号_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

Sql 按ID选择最小序号

Sql 按ID选择最小序号,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,只是尝试编写一个简单的查询,以获取每个供应商ID的行,其中联系人名称不为空,并且具有最小CNTCT SEQU NUM 以下是我写的: SELECT VENDOR_ID, MIN(CNTCT_SEQ_NUM) AS CNTCT_SEQ_NUM , CONTACT_NAME FROM PS_VENDOR_CNTCT WHERE VENDOR_ID IN ('ERSUT', 'MOOREA') AND CONTACT_NAME <> '' GROUP BY CONTACT_NAME, VE

只是尝试编写一个简单的查询,以获取每个供应商ID的行,其中联系人名称不为空,并且具有最小CNTCT SEQU NUM

以下是我写的:

SELECT VENDOR_ID, MIN(CNTCT_SEQ_NUM) AS CNTCT_SEQ_NUM , CONTACT_NAME
FROM PS_VENDOR_CNTCT
WHERE VENDOR_ID IN ('ERSUT', 'MOOREA')
AND CONTACT_NAME <> ''
GROUP BY CONTACT_NAME, VENDOR_ID
预期结果将是:


相关子查询可解决此问题:

select vc.*
from PS_VENDOR_CNTCT vc
where vc.CNTCT_SEQ_NUM = (select min(vc2.CNTCT_SEQ_NUM)
                          from PS_VENDOR_CNTCT vc2
                          where vc2.VENDOR_ID = vc.VENDOR_ID and
                                vc2.CONTACT_NAME <> ''
                         );

为了提高性能,您可以尝试对供应商ID、联系人姓名、CNTCT SEQ NUM进行索引。这涵盖了子查询,但仍需要扫描所有索引记录。

相关子查询解决了以下问题:

select vc.*
from PS_VENDOR_CNTCT vc
where vc.CNTCT_SEQ_NUM = (select min(vc2.CNTCT_SEQ_NUM)
                          from PS_VENDOR_CNTCT vc2
                          where vc2.VENDOR_ID = vc.VENDOR_ID and
                                vc2.CONTACT_NAME <> ''
                         );
为了提高性能,您可以尝试对供应商ID、联系人姓名、CNTCT SEQ NUM进行索引。这包括子查询,但仍需要扫描所有索引记录。

尝试此操作-

SELECT A.* FROM PS_VENDOR_CNTCT A
INNER JOIN
(
    SELECT VENDOR_ID,MIN(CNTCT_SEQ_NUM) CNTCT_SEQ_NUM
    FROM PS_VENDOR_CNTCT
    GROUP BY VENDOR_ID
)B ON A.VENDOR_ID = B.VENDOR_ID
AND A.CNTCT_SEQ_NUM = B.CNTCT_SEQ_NUM
试试这个-

SELECT A.* FROM PS_VENDOR_CNTCT A
INNER JOIN
(
    SELECT VENDOR_ID,MIN(CNTCT_SEQ_NUM) CNTCT_SEQ_NUM
    FROM PS_VENDOR_CNTCT
    GROUP BY VENDOR_ID
)B ON A.VENDOR_ID = B.VENDOR_ID
AND A.CNTCT_SEQ_NUM = B.CNTCT_SEQ_NUM
似乎您不需要MIN,但需要行数等窗口分析函数

似乎您不需要MIN,但需要行数等窗口分析函数


问题-为什么此查询返回2行?两者具有相同的EFFDT,但其中一个具有最小CNTCT_SEQ_NUM SELECT VENDOR_ID、最小CNTCT_SEQ_NUM CNTCT_SEQ_NUM、SETID、联系人姓名、来自PS_VENDOR_CNTCT的EFFDT,其中联系人姓名和供应商ID='05876A'按供应商ID、SETID、联系人姓名分组,ERSUT为EFFDT1行,MOOREA为1行。它非常简单,就如同在供应商ID上应用GROUP BY一样。问题-为什么这个查询返回2行?两者具有相同的EFFDT,但其中一个具有最小CNTCT_SEQ_NUM SELECT VENDOR_ID、最小CNTCT_SEQ_NUM CNTCT_SEQ_NUM、SETID、联系人姓名、来自PS_VENDOR_CNTCT的EFFDT,其中联系人姓名和供应商ID='05876A'按供应商ID、SETID、联系人姓名分组,ERSUT为EFFDT1行,MOOREA为1行。它非常简单,只需在供应商ID上应用GROUP BY。您只需按供应商ID进行分区。您只需按供应商ID进行分区。
SELECT DISTINCT Q.VENDOR_ID, Q.CONTACT_NAME, Q.CNTCT_SEQ_NUM
  FROM
  (
  SELECT P.*, 
         ROW_NUMBER() OVER 
                     (PARTITION BY VENDOR_ID ORDER BY CNTCT_SEQ_NUM) AS RN
    FROM PS_VENDOR_CNTCT P
   WHERE VENDOR_ID IN ('ERSUT', 'MOOREA')
     AND CONTACT_NAME <> ''     
   ) Q
  WHERE Q.RN = 1