Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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,样本数据为: l16seqno | l16lcode | carrno | ecarrno | l16qty | reasoncode 32001 | 12 | 207620 | 370036873034035916 | 32 | 0 32269 | 12 | 207620 | 370036873034035916 | -32 | 800 39075 | 12 | 2076

样本数据为:
l16seqno | l16lcode | carrno | ecarrno | l16qty | reasoncode
32001 | 12 | 207620 | 370036873034035916 | 32 | 0
32269 | 12 | 207620 | 370036873034035916 | -32 | 800
39075 | 12 | 207620 | 370036873034035916 | 32 | 0
39074 | 12 | 207622 | 370036873034035923 | 32 | 0
32268 | 12 | 207622 | 370036873034035923 | -32 | 800
31999 | 12 | 207622 | 370036873034035923 | 32 | 0
32271 | 12 | 207624 | 370036873034035930 | -32 | 800
32005 | 12 | 207624 | 370036873034035930 | 32 | 0
39077 | 12 | 207624 | 370036873034035930 | 32 | 0
如何更改此查询以获取同一ecarrno feild的一条理性码为800的记录,然后获取下一条理性码为0的记录?

给您:

;with cte as
(
    Select  l16seqno
            ,l16lcode
            ,carrno
            ,ecarrno
            ,l16qty
            ,reasoncode
            ,ROW_NUMBER() Over(Partition By ecarrno, reasoncode Order By l16seqno) rn
    From    MyTable
)
Select  l16seqno
        ,l16lcode
        ,carrno
        ,ecarrno
        ,l16qty
        ,reasoncode
From    cte
Where   rn = 1
Order By ecarrno asc, reasoncode desc

下面是一些可以用来修改现有查询的示例代码

请注意,此示例先筛选第一次出现的reasoncode=800,然后再筛选l16seqno大于reasoncode=800记录的第一次出现的reasoncode=0的子筛选器

下面是上面列出的示例代码的示例


我希望这有帮助。

这是sql server还是oracle?没有PL/SQL删除标记。@Hansen-哪个版本的SS?它只涉及SQL,所以它应该在所有版本的SS上运行,然后删除不必要的标记。不必要的标记已被删除谢谢您的回复。。戴夫!让我试试,然后我会回到你身边的汉克斯·拉兹洛。。谢谢你的帮助。。。我设法使它工作,它给出了预期的结果。你真好:
;with cte as
(
    Select  l16seqno
            ,l16lcode
            ,carrno
            ,ecarrno
            ,l16qty
            ,reasoncode
            ,ROW_NUMBER() Over(Partition By ecarrno, reasoncode Order By l16seqno) rn
    From    MyTable
)
Select  l16seqno
        ,l16lcode
        ,carrno
        ,ecarrno
        ,l16qty
        ,reasoncode
From    cte
Where   rn = 1
Order By ecarrno asc, reasoncode desc
CREATE TABLE reasons (
  l16seqno int NOT NULL,
  carrno int NOT NULL,
  reasoncode int NOT NULL
  );

INSERT INTO reasons
  (l16seqno, carrno, reasoncode)
VALUES
  (1, 1, 0),
  (2, 1, 800),
  (3, 1, 0),
  (10, 300, 0),
  (11, 300, 800),
  (12, 300, 0),
  (13, 300, 800),
  (14, 300, 0),
  (1003, 1212, 0),
  (1004, 1212, 800),
  (1005, 1212, 0),
  (1006, 1212, 0);

WITH cte1 (l16seqno, carrno, reasoncode, rownumber)
AS
(
  SELECT l16seqno, carrno, reasoncode, ROW_NUMBER() OVER (PARTITION BY carrno, reasoncode ORDER BY l16seqno)
  FROM reasons
  WHERE reasoncode = 800
),
cte2 (l16seqno, carrno, reasoncode, rownumber)
AS
(
  SELECT r.l16seqno, r.carrno, r.reasoncode, ROW_NUMBER() OVER (PARTITION BY r.carrno, r.reasoncode ORDER BY r.l16seqno)
  FROM reasons AS r
  INNER JOIN cte1 AS c ON r.carrno = c.carrno
  WHERE r.reasoncode = 0 AND r.l16seqno > c.l16seqno
)
SELECT r.l16seqno, r.carrno, r.reasoncode
FROM reasons AS r
LEFT OUTER JOIN cte1 AS c1 ON c1.l16seqno = r.l16seqno
LEFT OUTER JOIN cte2 AS c2 ON c2.l16seqno = r.l16seqno
WHERE c1.rownumber = 1
OR c2.rownumber = 1
ORDER BY r.carrno, r.l16seqno;