当前位置: 首页 > 面试题库 >

如何与列名称一起获得最高的值

赫连子石
2023-03-14
问题内容

我有一个包含10列的表格,其中有八列是带有日期的列。我期望的结果是获取每一行的最大日期(我已经完成的工作),但我也想获取最大日期来自的列的名称。

    SELECT s.sp_id
,s.sp_numer
,(
    SELECT MAX(Data_przedawnienia_update)
    FROM (
        VALUES (Data_przedawnienia_Postanowienie_o_umorzeniu_egzekucji)
            ,(Data_przedawnienia_Egzekucja_w_toku)
            ,(Data_przedawnienia_Nakaz_zaplaty_z_klauzula)
            ,(Data_przedawnienia_Nakaz_zaplaty)
            ,(Data_przedawnienia_Sprawa_sadowa_w_toku)
            ,(Data_przedawnienia_Wplaty_na_etapie_polubownym)
            ,(Data_przedawnienia_Umowa_ugody)
            ,(Data_przedawnienia_Wypowiedzenie_umowy)
        ) AS Data_przedawnienia(Data_przedawnienia_update)
    ) AS Data_przedawnienia_update
FROM dm_data_bps.dbo.sprawa AS s
INNER JOIN dm_data_bps.dbo.cache_sprawa_info AS csi ON s.sp_id = csi.sp_id
AND sprawa_zamknieta = 0
LEFT JOIN ##Postanowienie_o_umorzeniu_egzekucji AS umorzenie ON s.sp_id =       
umorzenie.sp_id
LEFT JOIN ##Egzekucja_w_toku AS egzekucja ON s.sp_id = egzekucja.sp_id
LEFT JOIN ##Nakaz_zaplaty_z_klauzula AS nakaz_kl ON s.sp_id = nakaz_kl.sp_id
LEFT JOIN ##Nakaz_zaplaty AS nakaz ON s.sp_id = nakaz.sp_id
LEFT JOIN ##Sprawa_sadowa_w_toku AS sprawa_sad ON s.sp_id = sprawa_sad.sp_id
LEFT JOIN ##Wplaty_na_etapie_polubownym AS wplaty_polubowny ON s.sp_id =   
wplaty_polubowny.sp_id
LEFT JOIN ##Umowa_ugody AS ugoda ON s.sp_id = ugoda.sp_id
LEFT JOIN ##Wypowiedzenie_umowy AS wypowiedzenie ON s.sp_id = 
wypowiedzenie.sp_id

问题答案:

XML具有处理通用查询的强大能力:

DECLARE @tbl TABLE(ID INT IDENTITY,d1 DATE, d2 DATE, d3 DATE);
INSERT INTO @tbl VALUES
 ('20180101','20180102','20180103')  --one max value
,('20170101','20190102','20190102'); --two max values

SELECT TOP 1 WITH TIES
       t.ID 
      ,y.value('text()[1]','date') d
      ,y.value('local-name(.)','varchar(100)') c
FROM @tbl t
CROSS APPLY(SELECT d1,d2,d3 FOR XML PATH('d'),TYPE) A(x)
CROSS APPLY x.nodes('/d/*') B(y) 
ORDER BY DENSE_RANK() OVER(PARTITION BY ID ORDER BY y.value('text()[1]','date') DESC);

更新:一些解释

第一个CROSS APPLY将创建一个如下所示的XML:

<d>
  <d1>2018-01-01</d1>
  <d2>2018-01-02</d2>
  <d3>2018-01-03</d3>
</d>

第二个CROSS APPLY用于.nodes()返回中的所有节点<d>。通过.value()我们可以获得元素的名称(local- name())及其内容。

有诀窍DENSE_RANK,并TOP 1 WITH TIES返回其获得的所有行1(这是每个ID最高)。



 类似资料:
  • 问题内容: 我有一个员工表,如下所示: 我需要获取id等于4的问题的最小值和最大值。在这种情况下,我需要返回5和25。我使用以下查询实现了这一点: 但是,这不会返回的是问题ID。如何调整查询以显示q2是最小值,q4是最大值?我知道我可以写一个大写的语句,但是我也觉得可以使用联接来完成,但是我不知道。 注意:这是针对postgresql数据库的,但是我也标记了MySQL,因为我知道它也支持和函数。如

  • 问题内容: 我有下表 在这里,我有一个“学生”表,我想 从该学生表中获取从每个学科获得满分的学生的姓名,例如以下输出。 问题答案: 您可以使用ROW_NUMBER函数仅返回每个主题的“最佳”行: SQL小提琴 MS SQL Server 2008架构设置 : 查询1 : 结果 :

  • 我收到了一个SRSes列表(XML)请求: http://gis1:8080/geoserver/wms?SERVICE=WMS 然后解析它,得到一个像“EPSG: 1234”这样的EPSG代码列表 我现在如何才能为“EPSG:28413”获得特定SRS的名称,如“Pulkovo 1942/Gauss Kruger zone 13”? ...或者我可以通过OpenLayers API来实现?

  • 我有下表 在这里,我有一个“学生”表,我想 从学生表中获取每个科目的最大分数的学生的姓名,如以下输出。

  • 问题内容: 我有一个很好的功能,可以以给定类型打印有关给定方法的一些信息,这是一个goplay 除了我找不到找到方法参数名称的方法以外,我需要做的所有事情吗? 问题答案: 局部变量的名称(包括函数参数)仅适用于程序员。编译器在生成代码时将其丢弃。无法检索参数名称,因为它们在编译后的代码中不可用。

  • 我的谷歌页面上有几个栏目。列数随时间变化(将来可能会添加新列)。如果我的床单看起来像这样,我想得到一张地图或类似的东西: 查看我的工作表 API调用的响应: 换句话说,我想在api响应的工作表中获取列名及其标签。或者,任何类似的方法也会起作用。我不知道该做什么API调用。我知道调用,但我不知道如何获取此表中列的标签。我只能得到一定范围内的数据。我不知道如何获得列的标签。