SQL 检查配对不匹配的时间
SQL to check when pairs don't match
我正在使用 SQL Server 2012 我有以下示例数据
Date Type Symbol Price
6/30/1995 gaus 313586U72 109.25
6/30/1995 gbus 313586U72 108.94
6/30/1995 csus NES 34.5
6/30/1995 lcus NES 34.5
6/30/1995 lcus NYN 40.25
6/30/1995 uaus NYN 40.25
6/30/1995 agus SRR 10.25
6/30/1995 lcus SRR 0.45
7/1/1995 gaus 313586U72 109.25
7/1/1995 gbus 313586U72 108.94
我想在代码和价格匹配时过滤掉。如果类型不匹配也没关系。因此,根据上述数据,我预计只会看到
Date Type Symbol Price
6/30/1995 gaus 313586U72 109.25
6/30/1995 gbus 313586U72 108.94
6/30/1995 agus SRR 10.25
6/30/1995 lcus SRR 0.45
7/1/1995 gaus 313586U72 109.25
7/1/1995 gbus 313586U72 108.94
NES 和 NYN 已被过滤掉,因为它们的符号和价格匹配。
我正在考虑使用分区和行号,但我不确定如何使用那个或另一个函数来配对和过滤行。
* **UPDATE 我将测试回复。我应该提到我只想查看在同一日期发生的符号和价格的重复项。 table 也被称为 duppri
一种方法是将 exists
谓词与相关子查询一起使用,以检查特定交易品种是否有多个价格。:
select * from table1 t
where exists (
select 1
from table1
where symbol = t.symbol
and price <> t.price);
这会 return:
| Date | Type | Symbol | Price |
|------------------------|------|-----------|--------|
| June, 30 1995 02:00:00 | gaus | 313586U72 | 109.25 |
| June, 30 1995 02:00:00 | gbus | 313586U72 | 108.94 |
| June, 30 1995 02:00:00 | agus | SRR | 10.25 |
| June, 30 1995 02:00:00 | lcus | SRR | 0.45 |
| July, 01 1995 02:00:00 | gaus | 313586U72 | 109.25 |
| July, 01 1995 02:00:00 | gbus | 313586U72 | 108.94 |
编辑:受 Gordon Linoff 聪明答案的启发,另一种选择可能是使用 avg()
作为窗口函数:
select Date, Type, Symbol, Price
from (
select Date, Type, Symbol, Price, avg = avg(price) over (partition by symbol)
from table1) a
where avg <> price;
编辑:进行检查以确保仅 return 编辑同一日期的重复项:http://www.sqlfiddle.com/#!6/29d67/1
使用子select与GROUP BY
结合HAVING COUNT DISTINCT
找到"bad"符号:
select * from your_table
where symbol not in
(
select symbol
from your_table
group by symbol
having count(distinct price) > 1
)
我会使用 window 函数来解决这个问题:
select s.*
from (select s.*,
min(price) over (partition by symbol) as minprice,
max(price) over (partition by symbol) as maxprice
from sample s
) s
where minprice <> maxprice;
我正在使用 SQL Server 2012 我有以下示例数据
Date Type Symbol Price
6/30/1995 gaus 313586U72 109.25
6/30/1995 gbus 313586U72 108.94
6/30/1995 csus NES 34.5
6/30/1995 lcus NES 34.5
6/30/1995 lcus NYN 40.25
6/30/1995 uaus NYN 40.25
6/30/1995 agus SRR 10.25
6/30/1995 lcus SRR 0.45
7/1/1995 gaus 313586U72 109.25
7/1/1995 gbus 313586U72 108.94
我想在代码和价格匹配时过滤掉。如果类型不匹配也没关系。因此,根据上述数据,我预计只会看到
Date Type Symbol Price
6/30/1995 gaus 313586U72 109.25
6/30/1995 gbus 313586U72 108.94
6/30/1995 agus SRR 10.25
6/30/1995 lcus SRR 0.45
7/1/1995 gaus 313586U72 109.25
7/1/1995 gbus 313586U72 108.94
NES 和 NYN 已被过滤掉,因为它们的符号和价格匹配。
我正在考虑使用分区和行号,但我不确定如何使用那个或另一个函数来配对和过滤行。
* **UPDATE 我将测试回复。我应该提到我只想查看在同一日期发生的符号和价格的重复项。 table 也被称为 duppri
一种方法是将 exists
谓词与相关子查询一起使用,以检查特定交易品种是否有多个价格。:
select * from table1 t
where exists (
select 1
from table1
where symbol = t.symbol
and price <> t.price);
这会 return:
| Date | Type | Symbol | Price |
|------------------------|------|-----------|--------|
| June, 30 1995 02:00:00 | gaus | 313586U72 | 109.25 |
| June, 30 1995 02:00:00 | gbus | 313586U72 | 108.94 |
| June, 30 1995 02:00:00 | agus | SRR | 10.25 |
| June, 30 1995 02:00:00 | lcus | SRR | 0.45 |
| July, 01 1995 02:00:00 | gaus | 313586U72 | 109.25 |
| July, 01 1995 02:00:00 | gbus | 313586U72 | 108.94 |
编辑:受 Gordon Linoff 聪明答案的启发,另一种选择可能是使用 avg()
作为窗口函数:
select Date, Type, Symbol, Price
from (
select Date, Type, Symbol, Price, avg = avg(price) over (partition by symbol)
from table1) a
where avg <> price;
编辑:进行检查以确保仅 return 编辑同一日期的重复项:http://www.sqlfiddle.com/#!6/29d67/1
使用子select与GROUP BY
结合HAVING COUNT DISTINCT
找到"bad"符号:
select * from your_table
where symbol not in
(
select symbol
from your_table
group by symbol
having count(distinct price) > 1
)
我会使用 window 函数来解决这个问题:
select s.*
from (select s.*,
min(price) over (partition by symbol) as minprice,
max(price) over (partition by symbol) as maxprice
from sample s
) s
where minprice <> maxprice;