3

我有一张如下表,

TypeID   Name         Date
-------------------------------
1        Carrot    1-1-2013
1        Beetroot  1-1-2013
1        Beans     1-1-2013
2        cabbage   1-1-2013
2        potato    1-1-2013
2        tomato    1-1-2013
2        onion     1-1-2013

如果需要 2 行,那么它应该从 TypeId 1 返回 2 行,从 TypeId 2 返回 2 行。如果只需要 4 行,意味着我必须从 TypeId 1 中获取 4 行,从 TypeId 2 中获取 4 行,但 TypeId 1 只有 3 行所以我们只需要为 typeId 1 获取 3 行

怎么做?我要添加行号吗?

4

4 回答 4

2

对于 SQL 服务器;

编辑:您的问题略有改变;

如果您希望每个类别最多有 x 个项目,您可以使用ROW_NUMBER();

WITH cte AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY TypeID ORDER BY Name) rn FROM Table1
)
SELECT TypeID, Name, [Date] FROM cte 
WHERE rn <=3       -- here is where your x goes
ORDER BY TypeID;

一个用于测试的 SQLfiddle

于 2013-08-01T17:31:42.990 回答
1

您可以编写查询以按TypeID.

然后,如果您使用 SQL,则可以使用SELECT TOP Nor LIMIT N(取决于 DB),或者使用 TSQL 和 SQL Server,用于TOP(N)获取前 N 行。

如果您在 C# 代码中使用基于 LINQ 的 ORM,则可以使用Take(N),它会根据提供程序详细信息自动创建适当的查询以限制结果数量。

于 2013-08-01T17:20:04.030 回答
0

我认为您应该使用查询从类型 1 中选择 3 行.....然后从类型 2 中选择多行,然后将结果加在一起。

于 2013-08-01T17:22:11.130 回答
0
;With CTE(TypeID,Name,Date,RowNo)
AS
(
select *, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID)  from TableVEG
)
Select Top(@noofRows*2) * from CTE where RowNo<=@noofRows order by rowno

上面的查询有效.. 谢谢大家... :-)

于 2013-08-01T18:21:52.763 回答