SQL返回不同值的查询位置

时间:2015-04-16 18:37:15

标签: sql distinct 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
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

这是我能够得到的但是当我运行它时,我没有获得具有重复callindex值的行。持续时间不是mattern,它们永远不会匹配,所以如果它有助于查询使用它作为一个很好的过滤器。我添加了模拟数据来协助。

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)

非常感谢任何帮助。

好的,在这里的每个人的帮助下,我能够让查询在SQL中完美地运行。那说明显我正在尝试这个的应用程序有一个内置的字符限制,下面的查询太长。这是我必须使用的查询限制,我必须能够同时搜索两个ID,因为有些人很少用两个标记。我希望有人可以帮我缩短它?

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)

5 个答案:

答案 0 :(得分:2)

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

 4/15/2015 | Jane   | 5555051005  | 00000.0050    
 4/15/2015 | Jane   | 5555051005  | 00000.0050 

是否可以在WHERE中添加HAVING或GROUP BY?或者可能UNION SELECT到另一个SELECT语句?这可能会开辟一些额外的可能性。

答案 1 :(得分:1)

从您的示例中,您似乎可以排除ANI列中没有值的行。如果是这种情况,您可以这样做:

use Database
SELECT * FROM table
WHERE Date between '4/15/15 00:00' and '4/15/15 23:59'
and ANI is not null

如果这对您不起作用,请告诉我,我可以看到我还能做些什么。

编辑: 你已经让它听起来像CallIndex和Duration是一个独特的值。这似乎有点让我怀疑,但如果是这样的话,你可以这样做:

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)

答案 2 :(得分:1)

也许是工会:

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 ))

答案 3 :(得分:0)

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

SELECT *
FROM table
WHERE Date >= '2015-04-15' and Date < '2015-04-16'
      ani is not null;

如果空白值只是巧合,那么仅使用where子句就会出现问题。如果结果是完全重复(没有列具有不同的值),那么除非您使用的是SQLite,Oracle,否则您可能无法使用where子句执行所需操作。 Postgres的。

答案 4 :(得分:0)

您可以使用两个关键字来获取非重复数据,DISTINCTGROUP BY。在这种情况下,我会使用GROUP BY,但您应该阅读它们。

此查询按CallIndex对所有记录进行分组,并为每个其他列获取MAX值,并为您提供所需的结果:

SELECT MAX(Date) AS Date, MAX(Name) AS Name, MAX(ANI) AS ANI, CallIndex
FROM table
GROUP BY CallIndex

修改

由于您无法直接使用GROUP BY,但您可以在WHERE子句中使用任何SQL:

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
)

这将从表中选择GROUP BY中存在匹配行的所有行。

它不会是完美的,如果任何两行完全匹配,你仍然会有重复,但这是你获得限制的最佳选择。