表分组方式 - Sql -
Posted
技术标签:
【中文标题】表分组方式 - Sql -【英文标题】:Table Group By - Tsql - 【发布时间】:2010-10-07 22:38:49 【问题描述】:alt text http://img187.imageshack.us/img187/8453/testhc3.png
alt text http://img145.imageshack.us/img145/3306/test2bn4.png
第一张图片是我的查询。我需要在第二张图片中获得结果。
select OrarioA, OrarioB, MAX(VW_DettaglioOrariLinee_FromAToB.IDOrario), dbo.VW_DettaglioOrariLinee_FromAToB.IDDettaglioOrarioA, dbo.VW_DettaglioOrariLinee_FromAToB.IDDettaglioOrarioB
FROM dbo.VW_DettaglioOrariLinee_FromAToB INNER JOIN
Tb_Linee ON dbo.VW_DettaglioOrariLinee_FromAToB.IDRelA = Tb_Linee.IDRelA AND
dbo.VW_DettaglioOrariLinee_FromAToB.IDRelB = Tb_Linee.IDRelB INNER JOIN
dbo.periodi ON dbo.VW_DettaglioOrariLinee_FromAToB.IDOrario = dbo.periodi.IDOrario INNER JOIN
dbo.relgiornisettimanaorarilinee ON dbo.VW_DettaglioOrariLinee_FromAToB.IDOrario = dbo.relgiornisettimanaorarilinee.IDOrario
这是我真正的查询:
WITH Tb_Linee AS
(
SELECT * FROM VW_rellineestazionamenti
WHERE
IDLINEA = @IDLINEA
AND
IDStazA = @IDStazA
AND
IDStazB = @IDStazB
AND
PosizioneA = @PosizioneA
AND
PosizioneB = @PosizioneB
)
select OrarioA, OrarioB, VW_DettaglioOrariLinee_FromAToB.IDOrario, dbo.VW_DettaglioOrariLinee_FromAToB.IDDettaglioOrarioA, dbo.VW_DettaglioOrariLinee_FromAToB.IDDettaglioOrarioB
FROM dbo.VW_DettaglioOrariLinee_FromAToB INNER JOIN
Tb_Linee ON dbo.VW_DettaglioOrariLinee_FromAToB.IDRelA = Tb_Linee.IDRelA AND
dbo.VW_DettaglioOrariLinee_FromAToB.IDRelB = Tb_Linee.IDRelB INNER JOIN
dbo.periodi ON dbo.VW_DettaglioOrariLinee_FromAToB.IDOrario = dbo.periodi.IDOrario INNER JOIN
dbo.relgiornisettimanaorarilinee ON dbo.VW_DettaglioOrariLinee_FromAToB.IDOrario = dbo.relgiornisettimanaorarilinee.IDOrario
【问题讨论】:
【参考方案1】:如果您只想按OrarioA
进行分区:
SELECT OrarioA, OrarioB, IDOrario, IDDettaglioOrarioA, IDDettaglioOrarioB
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY OrarioA ORDER BY OrarioB DESC, IDOrario DESC) AS rn
FROM table
) t
WHERE rn = 1
,这将产生picture 2
上的结果集。
如果你想通过OrarioA
和OrarioB
进行分区:
SELECT OrarioA, OrarioB, IDOrario, IDDettaglioOrarioA, IDDettaglioOrarioB
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY OrarioA, OrarioB ORDER BY IDOrario DESC) AS rn
FROM table
) t
WHERE rn = 1
,但这不会过滤掉结果集中的第一行。
【讨论】:
只有一个问题,如果我想按 OrarioA 和 OrarioB 分区。我该怎么办?谢谢!!【参考方案2】:根据您在屏幕截图中解释的数据,我理解您需要按 OrarioA 和 OrarioB 分组的最高 IDOrario 的 id 字段?
SELECT IDDettaglioOrarioA, IDDettaglioOrarioB
FROM TABLE
GROUP BY
OrarioA, OrarioB
ORDER BY IDOrario DESC
如果您需要选择更多列,请随意选择更多。
【讨论】:
以上是关于表分组方式 - Sql -的主要内容,如果未能解决你的问题,请参考以下文章