我正在运行一个查询,它给了我超过800万条记录。我已将结果导出到.csv文件中,但该文件太大而无法处理(8GB ...)。
我尝试做的是将结果csv拆分为多个文件但有一个条件:
有一个列名" Locator"代表一个ID。我设法将我的记录分组以获得这样的结果:
Locator | Name | LastName
___________________________
ABCDEFH | Foo | Oof
ABCDEFH | Foo2 | Oof2
ABCDEFH | Foo3 | Oof3
TUVWXYZ | Mark | Mark
TUVWXYZ | Mark2| Mark2
... | ... | ...
所以我想要做的就是基本上分割记录而不用拆分分组......是否可以这样做?
编辑:这是使用NTILE的查询:
with locator as
(
select distinct
pnrlctrnum,
NTILE(8) OVER(ORDER BY pnrlctrnum) as Tile_Num
from ttddocseg, ttddoc, ttdhdr
where ttddocseg.tdtrxnum = ttddoc.tdtrxnum and ttdhdr.tdtrxnum = ttddoc.tdtrxnum
)
select ttdhdr.pnrlctrnum, ttddoc.*, ttddocseg.*
from ttddocseg, ttddoc, ttdhdr
inner join locator on locator.pnrlctrnum = ttdhdr.pnrlctrnum
where Tile_num = 7 and ttddocseg.tdtrxnum = ttddoc.tdtrxnum and ttdhdr.tdtrxnum = ttddoc.tdtrxnum
答案 0 :(得分:0)
您可以使用ntile函数生成组的组。这样可以确保组合在一起,然后您可以将导出分成多个您喜欢的分区。
更改数字以更改您想要的分组数量,然后您可以将其集成到您想要的导出过程中。
with locator as
(
select ditinct
Locator,
NTILE(4) OVER(ORDER BY Locator) as Tile_Num
from tbl
)
select *
from tbl
inner join locator on locator.Locator = tbl.Locator
where Tile_num = 3
答案 1 :(得分:0)
这种方法有一个错误。在 Person.Address 表中的示例 AdventureWorks DB 上重现相同的示例
with ps as
(
SELECT distinct PostalCode, ntile(6) over (order by PostalCode) as part
FROM [Person].[Address]
)
select * from( select PostalCode, count(distinct part) as part_count from ps group by PostalCode ) as tmp where part_count>1
结果是:
邮政编码 | part_count |
---|---|
3977 | 2 |
78400 | 2 |
92118 | 2 |
97301 | 2 |
GA10 | 2 |
有些邮政编码属于 1 个以上的组。这是因为分离是首先执行的。 ntile 尝试在不考虑值的情况下将相同大小的组分开,并且通过在 select 中使用 distinct ,您最终会在每个组中得到不同的值,但正如我们所见,某些值可能会重复。
为了避免这种情况再次发生,您应该首先获得不同的邮政编码,然后将它们分成几组,最后执行与主表的连接。
with ps as
(
select PostalCode, ntile(6) over (order by PostalCode) as part
from (select distinct PostalCode from Person.Address ) as tmp
)
select * from Person.Address a inner join ps on a.PostalCode= ps.PostalCode
通过这种方式,您可以将邮政编码组保存在同一分区中。正如您所见,分区中没有最大值等于下一个分区的最小值。
select ps.part, min(a.PostalCode) as minimum, max(a.PostalCode) as maximum from Person.Address a inner join ps
on a.PostalCode= ps.PostalCode group by ps.part
部分 | 最低 | 最大 |
---|---|---|
1 | 01071 | 32960 |
2 | 33000 | 59100 |
3 | 59101 | 84070 |
4 | 84074 | 94066 |
5 | 94070 | EM15 |
6 | G1R | YO15 |