1

一部のSQLをPostgreSQLからSQLServer(2005以降)に移行する必要があります。PostgreSQLで私は持っていました:

select count(id) as count, date
from table 
group by date 
order by count 
limit 10 offset 25

今、私は同じSQLが必要ですが、SQLServer用です。私は以下のようにそれをしましたが、エラーが発生します:Invalid column name 'count'.それを解決する方法は?

select * from (
   select row_number() over (order by count) as row, count(id) as count, date 
   from table 
   group by date
) a where a.row >= 25 and a.row < 35
4

3 に答える 3

5

エンディング を除いて、同じスコープでエイリアスを名前で参照することはできませんORDER BY(同じスコープのウィンドウ関数内では無効な参照です)。

まったく同じ結果を得るには、次のように拡張する必要がある場合があります(わかりやすくするためにネストスコープ)。

SELECT c, d FROM 
(
  SELECT c, d, ROW_NUMBER() OVER (ORDER BY c) AS row FROM 
  (
    SELECT d = [date], c = COUNT(id) FROM dbo.table GROUP BY [date]
  ) AS x
) AS y WHERE row >= 25 AND row < 35;

これは、モハンの答えに従って少し短くすることができます。

SELECT c, d FROM 
(
  SELECT COUNT(id), [date], ROW_NUMBER() OVER (ORDER BY COUNT(id))
   FROM dbo.table GROUP BY [date]
) AS y(c, d, row)
WHERE row >= 25 AND row < 35;

SQL Server 2012では、 OFFSET / FETCHを使用するとはるかに簡単になります。これは、以前の構文に近いものですが、実際には、独自のブードゥーではなく、ANSI互換の構文を使用しています。

SELECT c = COUNT(id), d = [date]
FROM dbo.table GROUP BY [date]
ORDER BY COUNT(id)
OFFSET 25 ROWS FETCH NEXT 10 ROWS ONLY;

は2010年にこの機能についてブログを書きました(そこにもたくさんの良いコメントがあります)、そしておそらくいくつかの深刻なパフォーマンステストを行うために時間を費やす必要があります。

そして私は@ajonに同意します-あなたの実際のテーブル、列、クエリがこのような予約語を乱用しないことを願っています。

于 2012-09-25T21:32:39.480 に答える
3

できます

DECLARE @startrow int=0,@endrow int=0

;with CTE AS (

select row_number() over ( order by count(id)) as row,count(id) AS count, date
from table
group by date 
)
SELECT * FROM CTE 
WHERE  row between @startrow and @endrow
于 2012-09-25T22:07:37.987 に答える
-3

これでうまくいくと思います

select * from (
   select row_number() over (order by id) as row, count(id) as count, date 
   from table 
   group by date
) a where a.row >= 25 and a.row < 35

また、使用しているSQL Serverのバージョンはわかりませんが、SQLServer2012には新しいページング機能があります

于 2012-09-25T21:32:44.510 に答える