我有以下查询。它按预期工作。但它有一个子查询。有没有办法优化它?
SELECT Foo,
count(*)
FROM
(SELECT Foo
FROM MyTable
GROUP BY Foo,
Bar,
Baz) AS Subquery
GROUP BY Foo
为了上下文
它正在处理的数据集如下:
| Foo | Bar | Baz |
|-----|-----|-----|
| a | 1 | |
| a | | 2 |
| b | 3 | |
| b | 3 | |
预期结果是:
| Foo | Count |
|-----|-------|
| a | 2 |
| b | 1 |
用文字解释。或尝试。
我希望每个Foo获得不同的Bar和Baz的数量。
答案 0 :(得分:3)
没有办法优化它,你可以用不同的方式编写它,但它不会更快。你可以像这样重写它,但你不能重写它以避免子选择:
SELECT Foo,
count(*)
FROM
(SELECT distinct Foo, bar, baz
FROM @t
) AS Subquery
GROUP BY Foo
答案 1 :(得分:2)
根据问题的编辑...
$(document).ready(function() {
// REUSABLE CODE
var projI=new OpenLayers.Projection("EPSG:900913");
var projE=new OpenLayers.Projection("EPSG:4326");
var center_lonlat=(/* variable declaration */);
var topleft=(/* variable declaration */);
var bottomright=(/* variable declaration */);
lat=Math.round(center_lonlat.lat * 1000000)/1000000;
lon=Math.round(center_lonlat.lon * 1000000)/1000000;
spn=/* variable declaration */;
});
$(document).ready(function() {
$('div .olControlAttribution').append('<a id="WMEtoGMM" href=" \
/* link here that uses above variables */"'+ \
'target="_blank">Open new page</a>');
});
$('div .view-area.olMap #mouseupElement').mouseup(function() {
$('#WMEtoGMM').attr('href', 'URL HERE');
});
如果间距字符不同(即您的数据不包含SELECT Foo, Count(distinct isnull(foo,'-')+isnull(bar,'-')+isnull(baz,'-'))
FROM MyTable
group by foo
https://data.stackexchange.com/stackoverflow/query/372553/for-question-32992867
我想你想要这个:
-
你可能想要这个:
SELECT Foo, count(*)
FROM MyTable
GROUP BY Foo, Bar, Baz
如果这些没有给你想要的结果,请解释原因
答案 2 :(得分:1)
<强>声明:强>
这是纯粹的有趣解决方案,它不是100%可靠,并且可能在发生碰撞时失败。我发布它只是为了尝试在没有子查询的情况下获得解决方案。它不会更快,所以请不要在生产系统中使用它。
我假设列Bar
xor Baz
中可以有一个值。
<强> LiveDemo 强>
CREATE TABLE #MyTable(Foo VARCHAR(100), Bar VARCHAR(10), Baz VARCHAR(10));
INSERT INTO #MyTable(Foo, Bar, Baz)
VALUES ('a', '1', NULL), ('a', NULL ,'2'), ('b', '3', NULL),
('a', '2', NULL), ('a', NULL ,'1'), ('b', '3', NULL),
('a', NULL, '2'), ('a', NULL ,'1'), ('b', '4', NULL),
('a', NULL, '1'), ('a', NULL ,'2'), ('b', '7', NULL);
SELECT Foo, COUNT(DISTINCT
CAST(CHECKSUM(Bar, Baz) AS BIGINT) +
CAST(CHECKSUM(Baz, Bar) AS BIGINT) +
CAST(CHECKSUM(REVERSE(Bar),REVERSE(Baz)) AS BIGINT) +
CAST(CHECKSUM(REVERSE(Baz),REVERSE(Bar)) AS BIGINT))
FROM #MyTable
GROUP BY Foo;
修改强>
如果('a', NULL, 1)
和('a', 1, NULL)
不同,则需要使用:
<强> LiveDemo2 强>
SELECT Foo, COUNT(DISTINCT
CAST(CHECKSUM(Bar, Baz) AS BIGINT) +
CAST(CHECKSUM(REVERSE(Bar),REVERSE(Baz)) AS BIGINT))
FROM #MyTable
GROUP BY Foo
任何想法如何改进它或为什么它“糟透了”赞赏。