按查询删除组中的子查询

时间:2015-10-07 12:48:27

标签: sql-server group-by subquery

我有以下查询。它按预期工作。但它有一个子查询。有没有办法优化它?

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的数量。

3 个答案:

答案 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

任何想法如何改进它或为什么它“糟透了”赞赏。