<div dir="ltr">Hi Steve,<div><br></div><div>Does this help?</div><div><br></div><div><br></div><div><div>select * from</div><div>(select gid,item,data, ROW_NUMBER() OVER (Partition by item order by gid) as subid from a) as t1</div><div>join </div><div>(select gid,item,moredata, ROW_NUMBER() OVER (Partition by item order by gid) as subid from b) as t2</div><div>on t1.item=t2.item and t1.subid=t2.subid;</div><div><br></div><div><br></div><div>Cheers</div><div>Phil</div><div><br></div></div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 19, 2015 at 3:06 AM, Stephen Woodbridge <span dir="ltr"><<a href="mailto:woodbri@swoodbridge.com" target="_blank">woodbri@swoodbridge.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I have an interesting join problem that I'm not sure how to tackle in sql.<br>
<br>
I have two tables that I need to join (well really match) like this:<br>
<br>
create table a (<br>
  gid serial,<br>
  item text,<br>
  data text<br>
);<br>
<br>
create table b (<br>
  gid serial,<br>
  item text,<br>
  moredata text<br>
);<br>
<br>
gid can be used to force correct ordering of the records.<br>
item can be one or more rows with the same value in it (for example there might be 10 item='foo' records)<br>
data and more data is stuff related to the given record.<br>
<br>
What I know is that:<br>
<br>
1. if table a has N rows for a given item then table b will have N rows<br>
2. that the N rows in table a and table b are in the same order by gid<br>
3. it is not safe to assume that a.gid=b.gid will link the correct records<br>
<br>
<br>
What I need is to match/join is:<br>
<br>
a.item.row[1] to b.item.row[1]<br>
a.item.row[2] to b.item.row[2]<br>
...<br>
a.item.row[N] to b.item.row[N]<br>
<br>
where a.item=b.item<br>
<br>
Any thoughts on how to solve this with SQL?<br>
<br>
select aa.item, aa.cnt, bb.cnt<br>
  from (select item, count(*) as cnt from a group by item) aa<br>
  left outer join (select item, count(*) as cnt from b group by item) b<br>
    on aa.item=bb.item<br>
 order by aa.item;<br>
<br>
So likewise, we should be able to do something like:<br>
<br>
select aa.item, aa.data, bb.moredata<br>
  from (select item, data from a order by item, gid) aa<br>
  left outer join (select item, moredata from b order by item, gid) b<br>
    on aa.item=bb.item and a.itemrow=b.itemrow<br>
 order by aa.item;<br>
<br>
This needs some way of assigning itemrow numbers that can be matched. I think this is an application of over() but I'm not quite sure how to apply it.<br>
<br>
Thoughts would be appreciated :)<br>
<br>
Thanks,<br>
  -Steve<br>
______________________________<u></u>_________________<br>
postgis-users mailing list<br>
<a href="mailto:postgis-users@lists.osgeo.org" target="_blank">postgis-users@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users" target="_blank">http://lists.osgeo.org/cgi-<u></u>bin/mailman/listinfo/postgis-<u></u>users</a><br>
</blockquote></div><br></div>