Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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_Oracle - Fatal编程技术网

Sql 如何查找表中第一个记录,我有多个这样的记录

Sql 如何查找表中第一个记录,我有多个这样的记录,sql,oracle,Sql,Oracle,我有几个列,我正在寻找一个SQL查询,它可以给我第4列和第5列的输出,当第一次看到值时,我的值为1,当它再次出现时,值将为0 希望我没有把问题弄得很复杂 UniqueNameCount和UniqueDescount是我正在查看的输出 Inventory ID Name Description UniqueNameCount UniqueDESCCount 预期成果: Inventory ID Name Description UniqueNameCount Unique

我有几个列,我正在寻找一个SQL查询,它可以给我第4列和第5列的输出,当第一次看到值时,我的值为1,当它再次出现时,值将为0

希望我没有把问题弄得很复杂

UniqueNameCount和UniqueDescount是我正在查看的输出

Inventory ID    Name    Description UniqueNameCount UniqueDESCCount
预期成果:

Inventory ID    Name    Description UniqueNameCount UniqueDESCCount
IN0001  Item 1  Desc 1  1   1
IN0002  Item 2  Desc 2  1   1
IN0003  Item 3  Desc 1  1   0
IN0004  Item 1  Desc 1  0   0
IN0005  Item 2  Desc 5  0   1
IN0006  Item 2  Desc 5  0   0
IN0007  Item 2  Desc 5  0   0
IN0008  Item 3  Desc 2  0   0
IN0009  Item 3  Desc 2  0   0
IN0010  Item 1  Desc 3  0   1

使用相关子查询找出是否已为较低的库存ID看到相同的名称或描述

select Inventory_ID, Name, Description,
       case when exists (select 1 from tablename t2
                         where t2.Name = t1.name
                           and t2.Inventory_ID < t1.Inventory_ID) then 0
            else 1
       end as UniqueNameCount,
       case when exists (select 1 from tablename t2
                         where t2.Description= t1.Description
                           and t2.Inventory_ID < t1.Inventory_ID) then 0
            else 1
       end as UniqueDESCCount
from tablename t1

Oracle 11g R2架构设置

CREATE TABLE table_name ( Inventory_ID, Name, Description ) AS
          SELECT 'IN0001',  'Item 1',  'Desc 1' FROM DUAL
UNION ALL SELECT 'IN0002',  'Item 2',  'Desc 2' FROM DUAL
UNION ALL SELECT 'IN0003',  'Item 3',  'Desc 1' FROM DUAL
UNION ALL SELECT 'IN0004',  'Item 1',  'Desc 1' FROM DUAL
UNION ALL SELECT 'IN0005',  'Item 2',  'Desc 5' FROM DUAL
UNION ALL SELECT 'IN0006',  'Item 2',  'Desc 5' FROM DUAL
UNION ALL SELECT 'IN0007',  'Item 2',  'Desc 5' FROM DUAL
UNION ALL SELECT 'IN0008',  'Item 3',  'Desc 2' FROM DUAL
UNION ALL SELECT 'IN0009',  'Item 3',  'Desc 2' FROM DUAL
UNION ALL SELECT 'IN0010',  'Item 1',  'Desc 3' FROM DUAL;
SELECT Inventory_ID,
       Name,
       Description,
       CASE
         WHEN LAG( Name ) OVER ( PARTITION BY Name ORDER BY Inventory_ID ) IS NULL
         THEN 1
         ELSE 0
         END AS UniqueNameCount,
       CASE
         WHEN LAG( Description ) OVER ( PARTITION BY Description ORDER BY Inventory_ID ) IS NULL
         THEN 1
         ELSE 0
         END AS UniqueDESCCount
FROM   table_name
ORDER BY Inventory_ID
| INVENTORY_ID |   NAME | DESCRIPTION | UNIQUENAMECOUNT | UNIQUEDESCCOUNT |
|--------------|--------|-------------|-----------------|-----------------|
|       IN0001 | Item 1 |      Desc 1 |               1 |               1 |
|       IN0002 | Item 2 |      Desc 2 |               1 |               1 |
|       IN0003 | Item 3 |      Desc 1 |               1 |               0 |
|       IN0004 | Item 1 |      Desc 1 |               0 |               0 |
|       IN0005 | Item 2 |      Desc 5 |               0 |               1 |
|       IN0006 | Item 2 |      Desc 5 |               0 |               0 |
|       IN0007 | Item 2 |      Desc 5 |               0 |               0 |
|       IN0008 | Item 3 |      Desc 2 |               0 |               0 |
|       IN0009 | Item 3 |      Desc 2 |               0 |               0 |
|       IN0010 | Item 1 |      Desc 3 |               0 |               1 |
查询1

CREATE TABLE table_name ( Inventory_ID, Name, Description ) AS
          SELECT 'IN0001',  'Item 1',  'Desc 1' FROM DUAL
UNION ALL SELECT 'IN0002',  'Item 2',  'Desc 2' FROM DUAL
UNION ALL SELECT 'IN0003',  'Item 3',  'Desc 1' FROM DUAL
UNION ALL SELECT 'IN0004',  'Item 1',  'Desc 1' FROM DUAL
UNION ALL SELECT 'IN0005',  'Item 2',  'Desc 5' FROM DUAL
UNION ALL SELECT 'IN0006',  'Item 2',  'Desc 5' FROM DUAL
UNION ALL SELECT 'IN0007',  'Item 2',  'Desc 5' FROM DUAL
UNION ALL SELECT 'IN0008',  'Item 3',  'Desc 2' FROM DUAL
UNION ALL SELECT 'IN0009',  'Item 3',  'Desc 2' FROM DUAL
UNION ALL SELECT 'IN0010',  'Item 1',  'Desc 3' FROM DUAL;
SELECT Inventory_ID,
       Name,
       Description,
       CASE
         WHEN LAG( Name ) OVER ( PARTITION BY Name ORDER BY Inventory_ID ) IS NULL
         THEN 1
         ELSE 0
         END AS UniqueNameCount,
       CASE
         WHEN LAG( Description ) OVER ( PARTITION BY Description ORDER BY Inventory_ID ) IS NULL
         THEN 1
         ELSE 0
         END AS UniqueDESCCount
FROM   table_name
ORDER BY Inventory_ID
| INVENTORY_ID |   NAME | DESCRIPTION | UNIQUENAMECOUNT | UNIQUEDESCCOUNT |
|--------------|--------|-------------|-----------------|-----------------|
|       IN0001 | Item 1 |      Desc 1 |               1 |               1 |
|       IN0002 | Item 2 |      Desc 2 |               1 |               1 |
|       IN0003 | Item 3 |      Desc 1 |               1 |               0 |
|       IN0004 | Item 1 |      Desc 1 |               0 |               0 |
|       IN0005 | Item 2 |      Desc 5 |               0 |               1 |
|       IN0006 | Item 2 |      Desc 5 |               0 |               0 |
|       IN0007 | Item 2 |      Desc 5 |               0 |               0 |
|       IN0008 | Item 3 |      Desc 2 |               0 |               0 |
|       IN0009 | Item 3 |      Desc 2 |               0 |               0 |
|       IN0010 | Item 1 |      Desc 3 |               0 |               1 |

CREATE TABLE table_name ( Inventory_ID, Name, Description ) AS
          SELECT 'IN0001',  'Item 1',  'Desc 1' FROM DUAL
UNION ALL SELECT 'IN0002',  'Item 2',  'Desc 2' FROM DUAL
UNION ALL SELECT 'IN0003',  'Item 3',  'Desc 1' FROM DUAL
UNION ALL SELECT 'IN0004',  'Item 1',  'Desc 1' FROM DUAL
UNION ALL SELECT 'IN0005',  'Item 2',  'Desc 5' FROM DUAL
UNION ALL SELECT 'IN0006',  'Item 2',  'Desc 5' FROM DUAL
UNION ALL SELECT 'IN0007',  'Item 2',  'Desc 5' FROM DUAL
UNION ALL SELECT 'IN0008',  'Item 3',  'Desc 2' FROM DUAL
UNION ALL SELECT 'IN0009',  'Item 3',  'Desc 2' FROM DUAL
UNION ALL SELECT 'IN0010',  'Item 1',  'Desc 3' FROM DUAL;
SELECT Inventory_ID,
       Name,
       Description,
       CASE
         WHEN LAG( Name ) OVER ( PARTITION BY Name ORDER BY Inventory_ID ) IS NULL
         THEN 1
         ELSE 0
         END AS UniqueNameCount,
       CASE
         WHEN LAG( Description ) OVER ( PARTITION BY Description ORDER BY Inventory_ID ) IS NULL
         THEN 1
         ELSE 0
         END AS UniqueDESCCount
FROM   table_name
ORDER BY Inventory_ID
| INVENTORY_ID |   NAME | DESCRIPTION | UNIQUENAMECOUNT | UNIQUEDESCCOUNT |
|--------------|--------|-------------|-----------------|-----------------|
|       IN0001 | Item 1 |      Desc 1 |               1 |               1 |
|       IN0002 | Item 2 |      Desc 2 |               1 |               1 |
|       IN0003 | Item 3 |      Desc 1 |               1 |               0 |
|       IN0004 | Item 1 |      Desc 1 |               0 |               0 |
|       IN0005 | Item 2 |      Desc 5 |               0 |               1 |
|       IN0006 | Item 2 |      Desc 5 |               0 |               0 |
|       IN0007 | Item 2 |      Desc 5 |               0 |               0 |
|       IN0008 | Item 3 |      Desc 2 |               0 |               0 |
|       IN0009 | Item 3 |      Desc 2 |               0 |               0 |
|       IN0010 | Item 1 |      Desc 3 |               0 |               1 |

库存ID名称描述UniqueNameCount UniqueDescount IN0001项目1描述1描述1描述1描述1描述0002项目2描述2描述1描述1描述1描述1描述0003项目3描述1描述1描述0描述1描述0描述0005项目2描述5描述0描述1描述0006项目2描述5描述0描述0描述0007项目2描述5描述0描述0描述0008项目3描述2描述0描述0描述9项目3描述2 0描述0描述0描述0010项目1描述3中应包含该注释你的问题你能把数据添加到问题中吗?(使用编辑。)同时添加预期结果。我无法添加。。在评论中添加了一些错误。抱歉,谢谢你的回答。这实际上要花很多时间!!您使用的是哪种数据库管理系统?其中一些不太擅长优化不存在子查询。@Saurabh,未经测试,但可能添加了更快的备选方案。-它根据
partitionby
子句将数据拆分为多个组,并通过
ORDER BY
子句对这些组进行内部排序,然后使用
LAG
(带有默认参数)将查看同一分区内当前行之前的行中的数据-如果它是
NULL
,则上一行中的数据是
NULL
,或者没有以前的数据(即,它是第一行);由于您的数据使用非
NULL
值,因此可以使用它来选择第一行。您也可以使用
行号()
分析函数而不是
滞后()