当我有2个List<string>
对象,那么我可以使用Intersect
,并Except
在他们身上直接得到一个输出IEnumerable<string>
.这很简单,但是如果我想要更复杂的东西的交集/分离怎么办?
例如,尝试获取ClassA
对象的集合,这是ClassA
对象AStr1
和ClassB
对象的交叉结果BStr
; :
public class ClassA {
public string AStr1 { get; set; }
public string AStr2 { get; set; }
public int AInt { get; set; }
}
public class ClassB {
public string BStr { get; set; }
public int BInt { get; set; }
}
public class Whatever {
public void xyz(List<ClassA> aObj, List<ClassB> bObj) {
// *** this …
Run Code Online (Sandbox Code Playgroud) 我正在使用MS SQL.
我有一个巨大的表与索引来快速查询:
select userid from IncrementalStatistics where
IncrementalStatisticsTypeID = 5 and
IncrementalStatistics.AssociatedPlaceID = 47828 and
IncrementalStatistics.Created > '12/2/2010
Run Code Online (Sandbox Code Playgroud)
它在不到1秒的时间内返回.该表有数十亿行.只有大约10000个结果.
我希望这个查询也能在大约一秒钟内完成:
select userid from IncrementalStatistics where
IncrementalStatisticsTypeID = 5 and
IncrementalStatistics.AssociatedPlaceID = 47828 and
IncrementalStatistics.Created > '12/2/2010'
intersect
select userid from IncrementalStatistics where
IncrementalStatisticsTypeID = 5 and
IncrementalStatistics.AssociatedPlaceID = 40652 and
IncrementalStatistics.Created > '12/2/2010'
intersect
select userid from IncrementalStatistics where
IncrementalStatisticsTypeID = 5 and
IncrementalStatistics.AssociatedPlaceID = 14403 and
IncrementalStatistics.Created > '12/2/2010'
Run Code Online (Sandbox Code Playgroud)
但它需要20秒.所有单个查询都需要<1秒,并返回大约10k的结果.
我希望SQL内部将每个子查询的结果抛出到哈希表中并进行哈希交集 - 应该是O(n).结果集足够大以适应内存,因此我怀疑这是一个IO问题.
我编写了一个备用查询,它只是一系列嵌套的JOIN,这也需要大约20秒,这是有道理的.
为什么INTERSECT这么慢?它是否在查询处理的早期阶段缩减为JOIN?
我想在Python(2.7)中交叉两个列表.我需要结果可迭代:
list1 = [1,2,3,4]
list2 = [3,4,5,6]
result = (3,4) # any kind of iterable
Run Code Online (Sandbox Code Playgroud)
在交叉点之后首先提供完整的迭代,以下哪个更有效?
使用发电机:
result = (x for x in list1 if x in list2)
Run Code Online (Sandbox Code Playgroud)
使用filter():
result = filter(lambda x: x in list2, list1)
Run Code Online (Sandbox Code Playgroud)
其他建议?
感谢
Amnon
我想知道我们是否可以做有条件的交叉.theres是somes查询,但结果是错误的(总是空的).我写下应该得到什么.
DECLARE @CAN_USE_TABLE1 BIT
DECLARE @CAN_USE_TABLE2 BIT
DECLARE @CAN_USE_TABLE3 BIT
DECLARE @CAN_USE_TABLE4 BIT
DECLARE @TABLE1 AS TABLE ( ABC INT ) -- values will be 1,2,3
DECLARE @TABLE2 AS TABLE ( ABC INT ) -- values will be 1,2
DECLARE @TABLE3 AS TABLE ( ABC INT ) --EMPTY TABLE
DECLARE @TABLE4 AS TABLE ( ABC INT ) --EMPTY TABLE
INSERT INTO @TABLE1 VALUES (1)
INSERT INTO @TABLE1 VALUES (2)
INSERT INTO @TABLE1 VALUES (3)
INSERT INTO @TABLE2 VALUES (1)
INSERT …
Run Code Online (Sandbox Code Playgroud) 我有一个范围列表,我想知道它们是否重叠.
我有以下代码.哪个似乎没有用.有没有更简单的方法来做到这一点或工作的方式:)
提前感谢任何建议.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private IList<Range> rangeList;
private void Form1_Load(object sender, EventArgs e)
{
rangeList.Add(new Range{FromNumber = 0, ToNumber = 100});
rangeList.Add(new Range { FromNumber = 101, ToNumber = 200 });
// this range should over lap and throw an exception
rangeList.Add(new Range { FromNumber = 199, ToNumber = 300 });
}
private bool RangesOverlap()
{
var bigList = new List<List<int>>();
foreach (var range in this.rangeList)
{
bigList.Add(new List<int> …
Run Code Online (Sandbox Code Playgroud) 我有两个表,列数相同,没有主键(我知道,这不是我的错).现在我需要删除表B中存在的表A中的所有行(它们相等,每个行有30列).
我认为最直接的方法是做一个INNER JOIN
并解决我的问题.但是,为所有列编写条件(担心NULL
)并不优雅(可能因为我的表也不优雅).
我想用INTERSECT
.我不知道该怎么办?这是我的第一个问题:
我试过(SQL Fiddle):
declare @A table (value int, username varchar(20))
declare @B table (value int, username varchar(20))
insert into @A values (1, 'User 1'), (2, 'User 2'), (3, 'User 3'), (4, 'User 4')
insert into @B values (2, 'User 2'), (4, 'User 4'), (5, 'User 5')
DELETE @A
FROM (SELECT * FROM @A INTERSECT SELECT * from @B) A
Run Code Online (Sandbox Code Playgroud)
但是所有行都从表中删除了@A
.
这让我想到了第二个问题:为什么命令DELETE @A FROM @B
会从表中删除所有行@A …
所以基本上我有两个表,包含URL和TAGS,通过连接表TAGS_URLS在两者之间具有has-and-belongs-to-many关系.
通过标记查找URL的简单查询将是:
SELECT urls.id FROM urls
INNER JOIN tags_urls ON urls.id=tags_urls.url_id
INNER JOIN tags ON tags_urls.tag_id=tags.id
WHERE tags.tag IN ("sample","tag","list");
Run Code Online (Sandbox Code Playgroud)
但是,我正在尝试恢复包含所有一组标记的所有URL的交集.即,只有包含标签"sample"和"tag"AND"list"的URL.
我有一个工作查询,但我无法在不到30秒的时间内执行查询.
SELECT a.id
FROM
(SELECT DISTINCT urls.id FROM urls
INNER JOIN tags_urls ON tags_urls.url_id=urls.id INNER JOIN tags ON tags.id=tags_urls.tag_id
WHERE tags.tag = 'sample') a
JOIN
(SELECT DISTINCT urls.id FROM urls
INNER JOIN tags_urls ON tags_urls.url_id=urls.id INNER JOIN tags ON tags.id=tags_urls.tag_id
WHERE tags.tag = 'list') b
ON a.id = b.id;
Run Code Online (Sandbox Code Playgroud)
结果集是正确的,但性能可怕.
我目前还在Redis数据库中将数据复制为存储在标记集中的URL ID列表,这样我就可以做到这样的事情并很快得到结果集.
SINTER "tag-sample" "tag-list"
Run Code Online (Sandbox Code Playgroud)
通过合理的努力,是否有可能通过SINTER将此任务的MySQL性能提升到Redis级别?
我试图基于多个条件上的两个data.frames的交集来填充二进制向量.
我有代码工作,但我觉得只是为了得到二进制矢量是内存过多.
当我将我的代码应用于我的完整数据(40毫米+行)时.我开始有记忆问题.
是否有更简单的方法来生成向量?
以下是一些样本数据(例如,子样本仅包括完整样本中的obs.):
ob1_1 <- as.data.frame(cbind(c(1999),c("111","222","666","777")),stringsAsFactors=FALSE)
ob2_1 <- as.data.frame(cbind(c(2000),c("111","333","555","777")),stringsAsFactors=FALSE)
ob3_1 <- as.data.frame(cbind(c(2001),c("111","222","333","777")),stringsAsFactors=FALSE)
ob4_1 <- as.data.frame(cbind(c(2002),c("111","444","555","777")),stringsAsFactors=FALSE)
full_sample <- rbind(ob1_1,ob2_1,ob3_1,ob4_1)
colnames(full_sample) <- c("yr","ID")
ob1_2 <- as.data.frame(cbind(c(1999),c("111","222","777")),stringsAsFactors=FALSE)
ob2_2 <- as.data.frame(cbind(c(2000),c("333")),stringsAsFactors=FALSE)
ob3_2 <- as.data.frame(cbind(c(2001),c("888")),stringsAsFactors=FALSE)
ob4_2 <- as.data.frame(cbind(c(2002),c("111","444","555","777")),stringsAsFactors=FALSE)
sub_sample <- rbind(ob1_2,ob2_2,ob3_2,ob4_2)
colnames(sub_sample) <- c("yr","ID")
Run Code Online (Sandbox Code Playgroud)
这是我的工作代码:
q_intersect <- ""
q_intersect <- paste(q_intersect , "select a.yr, a.ID ", sep=" ")
q_intersect <- paste(q_intersect , "from full_sample a ", sep=" ")
q_intersect <- paste(q_intersect , "intersect ", sep=" ")
q_intersect <- paste(q_intersect , "select b.yr, b.ID …
Run Code Online (Sandbox Code Playgroud) 我有一个名为admin的用户,该用户具有公司列表。我想返回拥有一个或多个相同公司的用户列表。我正在使用Linq使用此查询,但是我不确定为什么它不起作用。我不太了解.Any()的功能,但是如果我不包括它,则程序会出现语法错误。这是我的尝试:
public List<User> GetUsers(User admin)
{
return Users.Where(user=>user.Companys.Intersect(admin.Companys)).Any()).ToList();
}
Run Code Online (Sandbox Code Playgroud) 我在搜索包含特定坐标的图像时遇到问题。我无法让 intersect 函数与 API 一起使用。
我收到此错误消息:
sentinelsat.sentinel.SentinelAPIError: HTTP status 200 OK: Invalid query string. Check the parameters and format.
Run Code Online (Sandbox Code Playgroud)
那么我怎样才能让查询与交集一起工作?
使用的代码:
from sentinelsat import SentinelAPI, read_geojson, geojson_to_wkt
from datetime import date
from shapely.geometry import box, Polygon
api = SentinelAPI('myusername', 'mypassword','https://scihub.copernicus.eu/dhus')
footprint='footprint:"intersects(POLYGON((0 0,1 1,0 1,0 0)))"'
products = api.query(footprint,
date=('20180901', date(2018, 9, 3)),
area_relation='Intersects',
platformname='Sentinel-2',
cloudcoverpercentage=(0, 10))
print(products)
#this works
#api.download_all(products)
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?
intersect ×10
c# ×3
list ×3
sql ×3
python ×2
.net ×1
algorithm ×1
api ×1
conditional ×1
database ×1
intersection ×1
join ×1
linq ×1
memory ×1
mysql ×1
python-2.7 ×1
r ×1
range ×1
sentinelsat ×1
sql-delete ×1
sql-server ×1
sqldf ×1