Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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_Distinct_Where - Fatal编程技术网

SQL查询返回不同的值

SQL查询返回不同的值,sql,distinct,where,Sql,Distinct,Where,我有一个应用程序,它内置了初始选择选项,只允许我从Where部分进入。我有重复值的行。我试图为每个不同的值获取一条记录的列表,但不确定如何使该语句起作用。我已经找到了一个几乎可以做到这一点,但它不会给我任何有重复的行。我假设由于=所以只需要一种方法来为每个匹配我的where条件的对象获取一个。下面的例子 Date | Name | ANI | CallIndex | Duration ---------------------------------------

我有一个应用程序,它内置了初始选择选项,只允许我从Where部分进入。我有重复值的行。我试图为每个不同的值获取一条记录的列表,但不确定如何使该语句起作用。我已经找到了一个几乎可以做到这一点,但它不会给我任何有重复的行。我假设由于=所以只需要一种方法来为每个匹配我的where条件的对象获取一个。下面的例子

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
初始数据集

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
我希望查询返回的内容

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30
4/10/2015 | April  | 5555051003  | 00000.0030  | 35
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
这是我能够得到的,但是当我运行它时,我没有得到具有dups CALINDEX值的行。持续时间并不重要,而且它们从来都不匹配,所以如果使用它作为过滤器进行查询会有帮助,那就好了。我添加了模拟数据以提供帮助

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
use Database
SELECT * FROM table
WHERE Date between '4/15/15 00:00' and '4/15/15 23:59'
and callindex in
                (SELECT callindex 
                 FROM table 
                 GROUP BY callinex 
                 HAVING COUNT(callindex) = 1)
任何帮助都将不胜感激

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
好的,在这里所有人的帮助下,我能够让查询在SQL中完美地工作。也就是说,显然我正在尝试的应用程序有一个内置的字符限制,下面的查询太长了。就限制而言,这是我必须使用的查询,并且我必须能够同时搜索两个ID,因为有些ID上会打上一个或另一个的印记,而很少同时打上这两个ID。我希望有人能帮我缩短

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
use Database
select * from tblCall
WHERE 
    flddate between '4/15/15 00:00' and '4/15/15 23:59'
    and fldAgentLoginID='1234'
    and fldcalldir='incoming'
    and fldcalltype='external'
    and EXISTS (SELECT * FROM (SELECT MAX(fldCallName) AS fldCallName, fldCallID FROM tblCall GROUP BY fldCallID) derv WHERE tblCall.fldCallName = derv.fldCallName AND tblCall.fldCallID = derv.fldCallID)
or
    flddate between '4/15/15 00:00' and '4/15/15 23:59'
    and '4/15/15 23:59'
    and fldPhoneLoginID='56789'
    and fldcalldir='incoming'
    and fldcalltype='external'
    and EXISTS (SELECT * FROM (SELECT MAX(fldCallName) AS fldCallName, fldCallID FROM tblCall GROUP BY fldCallID) derv WHERE tblCall.fldCallName = derv.fldCallName AND tblCall.fldCallID = derv.fldCallID)

从示例中,似乎可以排除ANI列中没有值的行。如果是这种情况,您可以简单地执行以下操作:

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
use Database
SELECT * FROM table
WHERE Date between '4/15/15 00:00' and '4/15/15 23:59'
and ANI is not null
如果这对你不起作用,让我知道,我可以看看我还能做些什么

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
编辑: 您已经让它听起来像CallIndex与持续时间的组合是一个独特的值。我觉得这有点可疑,但如果是这样,你可以这样做:

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
use Database
SELECT * FROM table
WHERE Date between '4/15/15 00:00' and '4/15/15 23:59'
and cast(callindex as varchar(80))+'-'+cast(min(duration) as varchar(80)) in
                (SELECT cast(callindex as varchar(80))+'-'+cast(min(duration) as varchar(80)) 
                 FROM table 
                 GROUP BY callindex)

从示例中,似乎可以排除ANI列中没有值的行。如果是这种情况,您可以简单地执行以下操作:

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
use Database
SELECT * FROM table
WHERE Date between '4/15/15 00:00' and '4/15/15 23:59'
and ANI is not null
如果这对你不起作用,让我知道,我可以看看我还能做些什么

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
编辑: 您已经让它听起来像CallIndex与持续时间的组合是一个独特的值。我觉得这有点可疑,但如果是这样,你可以这样做:

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
use Database
SELECT * FROM table
WHERE Date between '4/15/15 00:00' and '4/15/15 23:59'
and cast(callindex as varchar(80))+'-'+cast(min(duration) as varchar(80)) in
                (SELECT cast(callindex as varchar(80))+'-'+cast(min(duration) as varchar(80)) 
                 FROM table 
                 GROUP BY callindex)

在你的数据中,为什么不这样做呢

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
SELECT *
FROM table
WHERE Date >= '2015-04-15' and Date < '2015-04-16'
      ani is not null;

<>如果空白值只是一个巧合,那么使用WHERE子句就有问题了。如果结果是完全重复的,没有任何列具有不同的值,那么您可能无法仅使用where子句执行所需操作-除非您在数据中使用SQLite、Oracle或Postgres。

为什么不这样做

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
SELECT *
FROM table
WHERE Date >= '2015-04-15' and Date < '2015-04-16'
      ani is not null;

<>如果空白值只是一个巧合,那么使用WHERE子句就有问题了。如果结果是完全重复的,没有列具有不同的值,那么您可能无法仅使用where子句执行所需操作-除非您使用的是SQLite、Oracle或Postgres。

有两个关键字可用于获取非重复数据,可以是DISTINCT或GROUP BY。在这种情况下,我将使用分组方式,但您应该阅读这两种方式

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
此查询按CallIndex对所有记录进行分组,并获取其他每列的最大值,并应提供所需的结果:

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
SELECT MAX(Date) AS Date, MAX(Name) AS Name, MAX(ANI) AS ANI, CallIndex
FROM table
GROUP BY CallIndex
编辑

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
由于不能直接使用GROUP BY,但可以在WHERE子句中使用任何SQL,因此可以执行以下操作:

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
SELECT *
FROM table
WHERE EXISTS
(
    SELECT *
    FROM 
    (
       SELECT MAX(Date) AS Date, MAX(Name) AS Name, MAX(ANI) AS ANI, CallIndex
       FROM table
       GROUP BY CallIndex   
    ) derv
    WHERE table.Date = derv.Date 
         AND table.Name = derv.Name
         AND table.ANI = derv.ANI
         AND table.CallIndex = derv.CallIndex
)
这将从存在分组依据中的匹配行的表中选择所有行

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35

这并不完美,如果任何两行完全匹配,您仍然会有重复的数据,但这是您在限制条件下得到的最好结果。

有两个关键字可用于获取非重复数据,可以是DISTINCT或GROUP BY。在这种情况下,我将使用分组方式,但您应该阅读这两种方式

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
此查询按CallIndex对所有记录进行分组,并获取其他每列的最大值,并应提供所需的结果:

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
SELECT MAX(Date) AS Date, MAX(Name) AS Name, MAX(ANI) AS ANI, CallIndex
FROM table
GROUP BY CallIndex
编辑

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
由于不能直接使用GROUP BY,但可以在WHERE子句中使用任何SQL,因此可以执行以下操作:

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
SELECT *
FROM table
WHERE EXISTS
(
    SELECT *
    FROM 
    (
       SELECT MAX(Date) AS Date, MAX(Name) AS Name, MAX(ANI) AS ANI, CallIndex
       FROM table
       GROUP BY CallIndex   
    ) derv
    WHERE table.Date = derv.Date 
         AND table.Name = derv.Name
         AND table.ANI = derv.ANI
         AND table.CallIndex = derv.CallIndex
)
这将从存在分组依据中的匹配行的表中选择所有行

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35

这将不是完美的,如果任意两行完全匹配,您仍然会有重复的,但这是您通过限制得到的最好结果。

如果限制是我们只能添加到WHERE子句,我认为这是不可能的,因为有两行完全相同:

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
 4/15/2015 | Jane   | 5555051005  | 00000.0050    
 4/15/2015 | Jane   | 5555051005  | 00000.0050 

您是否可以将HAVING或GROUP BY添加到WHERE?或者可能将SELECT语句联合到另一个SELECT语句?这可能会带来一些额外的可能性

如果约束条件是我们只能添加WHERE子句,我认为这是不可能的,因为有两行完全相同:

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
 4/15/2015 | Jane   | 5555051005  | 00000.0050    
 4/15/2015 | Jane   | 5555051005  | 00000.0050 
您是否可以将HAVING或GROUP BY添加到WHERE?或者可能将SELECT语句联合到另一个SELECT语句?这可能会带来一些额外的可能性

可能有工会:

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
SELECT *
FROM table
GROUP BY Date, Name, ANI, CallIndex
HAVING ( COUNT(*) > 1 )

UNION

SELECT *
FROM table
WHERE Name not in (SELECT name from table
GROUP BY Date, Name, ANI, CallIndex
HAVING ( COUNT(*) > 1 ))
也许有一个联盟:

Date      | Name   | ANI         | CallIndex   | Duration
---------------------------------------------------------    
2/2/2015  | John   | 5555051000  | 00000.0001  | 60  
2/2/2015  | John   |             | 00000.0001  | 70 
3/1/2015  | Jim    | 5555051001  | 00000.0012  | 80  
3/4/2015  | Susan  |             | 00000.0022  | 90 
3/4/2015  | Susan  | 5555051002  | 00000.0022  | 30  
4/10/2015 | April  | 5555051003  | 00000.0030  | 35 
4/11/2015 | Leon   | 5555051004  | 00000.0035  | 10 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 20 
4/15/2015 | Jane   | 5555051005  | 00000.0050  | 60 
4/15/2015 | Kevin  | 5555051006  | 00000.0061  | 35
SELECT *
FROM table
GROUP BY Date, Name, ANI, CallIndex
HAVING ( COUNT(*) > 1 )

UNION

SELECT *
FROM table
WHERE Name not in (SELECT name from table
GROUP BY Date, Name, ANI, CallIndex
HAVING ( COUNT(*) > 1 ))

你在使用什么数据库?请在你的支票上贴上标签

此表中是否有唯一的ID字段?或者仅仅这四列?用一个简单的in子句是不可能的,因为没有一列可以帮助你,只有一个组合。你只能通过一个连接来解决这个问题,或者,最简单的是,通过像Ben Jasper的answerI这样的group by语句来解决。我将它标记为SQL。你需要什么更具体的东西吗?我已经根据你提供的附加专栏更新了我的答案。看一看,让我知道它是否适合你。你使用的是什么数据库?请适当标记您的问题。此表中是否有唯一的ID字段?或者仅仅这四列?用一个简单的in子句是不可能的,因为没有一列可以帮助你,只有一个组合。你只能通过一个连接来解决这个问题,或者,最简单的是,通过像Ben Jasper的answerI这样的group by语句来解决。我将它标记为SQL。你需要什么更具体的东西吗?我已经根据你提供的附加专栏更新了我的答案。看一看,让我知道它是否对你有效。我不是OP,但他们让我觉得他们只能修改WHERE子句,而不能修改SELECT或GROUP BY子句。我做出了相当不公平的决定,我承认他们只是没有SQL技能来提出正确的问题。我确实觉得这可能是最好的处理方法,超出OP对这种情况的限制。比如将数据拉到excel,或者通过不同的方式访问数据。否则的话,情况就有点傻了——试图用糟糕的工具纠正糟糕的数据。你是对的,因为我没有SQL技能,但在这个问题上,我是认真的,我说我无法控制应用程序中的初始select语句,因为它是内置的。我从何处开始。现在,where中的select有效,这就是为什么这一行在select fldcallid FROM tblcall GROUP BY fldcallid COUNT fldcallid=1的fldcallid中工作正常fldcallid的原因。那么,有没有办法让它显示所有不同的值,或者只使用在该点工作的函数进行and分组?是的,我编辑了我的答案,将分组依据与您的限制相结合。我不是OP,但他们似乎只能更改WHERE子句,而不能更改SELECT或GROUP BY子句。我做出了相当不公平的选择,我承认他们只是没有SQL技能来提出正确的问题。我确实觉得这可能是最好的处理方法,超出OP对这种情况的限制。比如将数据拉到excel,或者通过不同的方式访问数据。否则的话,情况就有点傻了——试图用糟糕的工具纠正糟糕的数据。你是对的,因为我没有SQL技能,但在这个问题上,我是认真的,我说我无法控制应用程序中的初始select语句,因为它是内置的。我从何处开始。现在,where中的select有效,这就是为什么这一行在select fldcallid FROM tblcall GROUP BY fldcallid COUNT fldcallid=1的fldcallid中工作正常fldcallid的原因。那么,有没有办法让它显示所有不同的值,或者只使用在该点工作的函数进行and分组?是的,我已经编辑了我的答案,将GROUP BY与您的限制相结合。考虑到有限的示例,这看起来还可以。实际上,正如BranLakes指出的,有两行是完全重复的,ANI字段中有值。看来这个解决方案行不通。啊,是的。。。现在就看吧。遗憾的是,这也不行,因为有时它们的ANI值相同。他们确实有一个DUP上的持续时间字段,如果有帮助的话,这个字段永远不会相同?数据库大约有50列,所以不想只使用一个示例数据集就把它们全部放进去。是的,这会有帮助。您应该编辑您的问题并提供更多详细信息,因为在其当前状态下,无法使用您概述的方法解决问题。考虑到有限的示例,我认为这是可以的事实上,正如BranLakes指出的,有两行是完全重复的,ANI字段中有值。看来这个解决方案行不通。啊,是的。。。现在就看吧。遗憾的是,这也不行,因为有时它们的ANI值相同。他们确实有一个DUP上的持续时间字段,如果有帮助的话,这个字段永远不会相同?数据库大约有50列,所以不想只使用一个示例数据集就把它们全部放进去。是的,这会有帮助。您应该编辑您的问题并提供更多详细信息,因为在其当前状态下,无法使用您概述的方法解决该问题。是的,我认为可以,因为此查询可以工作,但不包括具有dup值的记录。我有一个持续时间字段可以使用,因为如果有两个字段会有帮助的话,这些字段永远不会相同。是的,我相信是这样,因为此查询可以工作,但不包括具有dup值的记录。我有一个持续时间字段,我可以使用,因为如果有两个字段会有所帮助的话,这些字段是不同的。